猿问

typedef固定长度数组

我必须定义一个24位数据char[3]类型。我用来表示类型。我可以的typedef char[3]type24?我在代码示例中尝试过它。我输入typedef char[3] type24;了我的头文件。编译器没有抱怨它。但是当我void foo(type24 val) {}在我的C文件中定义一个函数时,它确实抱怨了。我希望能够定义type24_to_int32(type24 val)代替的函数type24_to_int32(char value[3])



慕码人2483693
浏览 629回答 3
3回答

人到中年有点甜

typedef会是typedef char type24[3];但是,这可能是一个非常糟糕的主意,因为结果类型是一种数组类型,但它的用户不会看到它是一个数组类型。如果用作函数参数,它将通过引用传递,而不是通过值传递,并且sizeoffor它将是错误的。一个更好的解决方案是typedef struct type24 { char x[3]; } type24;您可能也希望使用unsigned char而不是char,因为后者具有实现定义的签名。

精慕HU

你要typedef char type24[3];C类型的声明很奇怪。如果声明了该类型的变量,则将类型精确地放在变量名称的位置。

侃侃尔雅

来自R ..的回答:但是,这可能是一个非常糟糕的主意,因为结果类型是一种数组类型,但它的用户不会看到它是一个数组类型。如果用作函数参数,它将通过引用传递,而不是通过值传递,并且它的sizeof将是错误的。没有看到它是一个数组的用户很可能会写这样的东西(失败):#include <stdio.h>typedef int twoInts[2];void print(twoInts *twoIntsPtr);void intermediate (twoInts twoIntsAppearsByValue);int main () {&nbsp; &nbsp; twoInts a;&nbsp; &nbsp; a[0] = 0;&nbsp; &nbsp; a[1] = 1;&nbsp; &nbsp; print(&a);&nbsp; &nbsp; intermediate(a);&nbsp; &nbsp; return 0;}void intermediate(twoInts b) {&nbsp; &nbsp; print(&b);}void print(twoInts *c){&nbsp; &nbsp; 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]&nbsp; &nbsp; print(&b);&nbsp; &nbsp; &nbsp;^note: expected ‘int (*)[2]’ but argument is of type ‘int **’&nbsp; &nbsp; void print(twoInts *twoIntsPtr);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^并产生以下输出:01-45330897632767
随时随地看视频慕课网APP
我要回答