【发布时间】:2020-01-30 04:03:45
【问题描述】:
在我定义了这样的枚举之后:
typedef enum { x = 1ULL<<40 } e;
似乎表达式“x”的计算结果为 1UL
但是,C11 6.4.4.3 说“声明为枚举常量的标识符具有 int 类型。”
顺便说一句,这可以节省我的时间,因为我想要枚举值 > 1如何;编写不符合标准的代码我有点紧张。
我试过这段代码:
int main() {
printf("%zu %zu %lx\n", sizeof(e), sizeof(x), x);
return 0;
}
用gcc -std=c11 -Wall(gcc 8.3.1,linux x86_64)编译,输出:8 8 10000000000。
如果我将 %lx 更改为 %llx,我会收到一个编译警告和相同的输出,这表明 x 是长尺寸的。
根据我对规范的阅读,我预计会出现编译警告并输出 4 4 0。
【问题讨论】:
-
还有“每个枚举类型应与 char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的”c17dr § 6.7.2.2 4 AFAIK,宽的类型是可以的,但不是
1ULL<<40。嗯 -
请注意,我违反了 §6.7.2.2 2,它表示枚举常量shall 具有可表示为
int的值。所以根据规范,我的代码是无效的 C。也许这允许他们在不违背规范的情况下扩展语言? -
我不会依赖此代码来工作,而是会找到另一个解决方案。