typedef固定长度数组

我必须定义一个24位数据types。我使用char[3]来表示types。 我可以typedef char[3]type24 ? 我在代码示例中试了一下。 我把typedef char[3] type24; 在我的头文件中。 编译器没有抱怨。 但是当我在我的C文件中定义了一个函数void foo(type24 val) {}时,它确实抱怨了。 我想能够定义typestype24_to_int32(type24 val)而不是type24_to_int32(char value[3])

typedef是

 typedef char type24[3]; 

但是,这可能是一个非常糟糕的想法,因为结果types是一个数组types,但用户不会看到它是一个数组types。 如果用作函数参数,它将通过引用传递,而不是通过值,并且sizeof将会是错误的。

更好的解决scheme是

 typedef struct type24 { char x[3]; } type24; 

你可能也想使用unsigned char而不是char ,因为后者具有实现定义的签名。

你要

 typedef char type24[3]; 

Ctypes的声明奇怪的方式。 如果您声明了该types的variables,则将该types准确地放在variables名称所在的位置。

从R ..的回答 :

但是,这可能是一个非常糟糕的想法,因为结果types是一个数组types,但用户不会看到它是一个数组types。 如果用作函数参数,它将通过引用传递,而不是通过值,并且sizeof将会是错误的。

没有看到它是一个数组的用户很可能会写这样的东西(失败):

 #include <stdio.h> typedef int twoInts[2]; void print(twoInts *twoIntsPtr); void intermediate (twoInts twoIntsAppearsByValue); int main () { twoInts a; a[0] = 0; a[1] = 1; print(&a); intermediate(a); return 0; } void intermediate(twoInts b) { print(&b); } void print(twoInts *c){ printf("%d\n%d\n", (*c)[0], (*c)[1]); } 

它将编译以下警告:

 In function 'intermediate': warning: passing argument 1 of 'print' from incompatible pointer type [enabled by default] print(&b); ^ note: expected 'int (*)[2]' but argument is of type 'int **' void print(twoInts *twoIntsPtr); ^ 

并产生以下输出:

 0 1 -453308976 32767 

数组中的值不能作为函数parameter passing

你可以把数组放在一个结构体中:

 typedef struct type24 { char byte[3]; } type24; 

然后通过值传递,但是当然不便于使用: x.byte[0]而不是x[0]

你的函数type24_to_int32(char value[3])实际上是通过指针传递的,而不是通过值。 它完全等同于type24_to_int32(char *value) ,并且3被忽略。

如果你很高兴通过指针,你可以坚持arrays,并做:

 type24_to_int32(const type24 *value); 

这将传递一个指向数组的指针,而不是指向第一个元素,所以你使用它作为:

 (*value)[0] 

我不确定这真的是一个收益,因为如果你不小心写了value[1]那么会发生一些愚蠢的事情。

要正确使用数组types作为函数参数或模板参数,请使用结构而不是typedef,然后向该结构中添加一个operator[] ,以便像这样保持数组的function:

 typedef struct type24 { char& operator[](int i) { return byte[i]; } char byte[3]; } type24; type24 x; x[2] = 'r'; char c = x[2];