我刚读了一篇优秀的帖子,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;
也没有问题。
基本上我错过了这个示例代码可以检测错误的原因。
你能说清楚我错过了什么吗?
答案 0 :(得分:1)
如果您使用gcc
编译-std=c89 -pedantic
或-std=c99 pedantic
到gcc
编译选项以获取此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,那可能就是您没有收到错误的原因。