为了账号安全,请及时绑定邮箱和手机立即绑定

typedef固定长度数组

typedef固定长度数组

C
慕码人2483693 2019-08-30 14:43:12
我必须定义一个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])。
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

typedef会是


typedef char type24[3];

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


一个更好的解决方案是


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

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


查看完整回答
反对 回复 2019-08-30
?
精慕HU

TA贡献1845条经验 获得超8个赞

你要


typedef char type24[3];

C类型的声明很奇怪。如果声明了该类型的变量,则将类型精确地放在变量名称的位置。


查看完整回答
反对 回复 2019-08-30
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

来自R ..的回答:


但是,这可能是一个非常糟糕的主意,因为结果类型是一种数组类型,但它的用户不会看到它是一个数组类型。如果用作函数参数,它将通过引用传递,而不是通过值传递,并且它的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


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 628 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信