数据类型大小 - 想知道一个好帖子

时间:2012-02-26 21:56:16

标签: c

我刚读了一篇优秀的帖子,Portable Fixed-Width Integers in C,一切都很有意义,直到差不多结束,我想知道以下段落意味着什么:

当然,如果您还没有符合C99的编译器,那么您仍然需要编写自己的一组typedef,使用特定于编译器的char,short和long原始宽度知识。我建议将这些typedef放在您自己设计的头文件中,并将清单2中所示的匿名联合声明添加到链接的源模块中以检查它们的大小;也就是说,轻轻地“提醒”任何人有一天可能会有移植代码的任务。

static union
{
    char   int8_t_incorrect[sizeof(  int8_t) == 1];
    char  uint8_t_incorrect[sizeof( uint8_t) == 1];
    char  int16_t_incorrect[sizeof( int16_t) == 2];
    char uint16_t_incorrect[sizeof(uint16_t) == 2];
    char  int32_t_incorrect[sizeof( int32_t) == 4];
    char uint32_t_incorrect[sizeof(uint32_t) == 4];
};

清单2.此匿名联合允许编译器检测并报告typedef错误

我试验了一个小程序:

typedef unsigned char  int8_t;
typedef unsigned short int16_t;

union u {
    char int8_incorrect[sizeof(int8_t)==1];
    char int16_incorrect[sizeof(int16_t)==2];
};


int main() {
    return 0;
}

编译器没有问题。我将int8_t更改为以下内容:

typedef unsigned int  int8_t;

也没有问题。

基本上我错过了这个示例代码可以检测错误的原因。

你能说清楚我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

如果您使用gcc编译-std=c89 -pedantic-std=c99 pedanticgcc编译选项以获取此typedef和联合类型的警告:

typedef unsigned int  int8_t;

对于这个typedef:

typedef unsigned char int8_t;

通常你没有得到任何警告,因为诀窍是检查类型的大小,而不是签名或无符号类型。

答案 1 :(得分:0)

我的理解是C标准不允许长度为0的数组。如果您将sizeof(int8_t) == 1写为数组长度,并且sizeof(int8_t) 1,则比较将评估为0,并且您将拥有非法的数组大小。

但是,以下链接显示GCC 允许零长度数组:

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

...所以如果您使用的是GCC,那可能就是您没有收到错误的原因。

相关问题