以下代码中枚举类型的大小不同,为什么?枚举类型的声明是否会导致gcc将其视为signed int?此功能会导致我的项目出现问题,例如,"file_1.c"中一个枚举类型的大小为1,但"file_2.c"中的大小为4.
我的测试代码:
enum foo foo_test(void);
enum foo {
    FOO_0
};
enum bar {
    BAR_0
};
int main(int argc, char **argv)
{
    printf("sizeof(enum foo) %d, sizeof(enum bar) %d\n", sizeof(enum foo), sizeof(enum bar));
    return 0;
}
当我在我的嵌入式项目中使用arm-none-eabi-gcc v4.9.3编译它时
sizeof(enum foo) 4, sizeof(enum bar) 1.当我在Windows中使用gcc v4.8.3编译它时
gcc -Wall -o sizeofTest.exe sizeofTest.c
sizeof(enum foo) 4, sizeof(enum bar) 4.gcc -Wall -fshort-enums -o sizeofTest.exe sizeofTest.c
sizeof(enum foo) 4, sizeof(enum bar) 1.正如在c中询问特殊结果的问题一样常见,这里的原因是未定义的行为.C11标准草案n1570 6.7.2.3p3:
表单的类型说明符
Run Code Online (Sandbox Code Playgroud)enum identifier没有枚举器列表只应在它指定的类型完成后出现.
- [...]枚举类型在终止枚举器声明列表之后立即完成,并在此后完成.
作为应在限制部分被侵犯,符合标准的编译器必须输出诊断消息-但除非你问它是GCC在默认情况下是不符合标准的实现-pedantic:
Run Code Online (Sandbox Code Playgroud)ISO C forbids forward references to ‘enum’ types [-Werror=pedantic] enum foo foo_test(void); ^
现在,似乎那里的编译器使用任何类型的最短枚举.由于你enum foo 之前使用的是它实际定义的内容,编译器不得不求助于int它的类型,否则char就被使用了.它可以复制-fshort-enums.你的程序打印4 1,而该程序打印1 1与-fshort-enums我的海湾合作委员会.
#include <stdio.h>
enum foo {
    FOO_0
};
enum foo foo_test(void);    
enum bar {
    BAR_0
};
int main(int argc, char **argv)
{
    printf("sizeof(enum foo) %zu, sizeof(enum bar) %zu\n", 
            sizeof(enum foo), sizeof(enum bar));
    return 0;
}