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];