为什么会这样:

#include <stdio.h>
#include <limits.h>
#include <inttypes.h>

int main() {
    enum en_e {
        en_e_foo,
        en_e_bar = UINT64_MAX,
    };
    enum en_e e = en_e_foo;
    printf("%zu\n", sizeof en_e_foo);
    printf("%zu\n", sizeof en_e_bar);
    printf("%zu\n", sizeof e);
}

在C中打印4 8 8,在C++中打印8 8 8(在一个带有4字节的平台上)

我的印象是,UINT64_MAX赋值将强制所有枚举常量至少为64位,但在普通C中,en_e_foo保持为32位.

这种差异的原因是什么?

推荐答案

我看了一下标准,我的程序在C中似乎违反了约束,因为6.7.2.2p2:

约束:定义枚举常量的值的表达式应为 为整数常量表达式,其值可表示为 内部

并使用C++定义,因为版本7.2.5:

如果基础类型不是固定的,则每个枚举数的类型为 其初始化值的类型: -如果指定了初始值设定项 对于枚举数,初始化值的类型与 表达式和常量表达式应为整数常量 表达式(5.19). -如果没有为第一个 枚举数,则初始化值具有未指定的整数类型. -否则初始化值的类型与类型相同 获取前面枚举数的初始化值,除非 增量值在该类型中不可表示,在这种情况下, 类型是一个未指定的整数类型,足以包含 递增的值.如果不存在这样的类型,则程序的格式不正确.

C++相关问答推荐

如何将FileFilter添加到FileDialog GTK 4

C指针算法在函数参数中的应用

GCC预处理宏和#杂注GCC展开

在C中将通用字符名称转换为UTF-8

当输入负数时,排序算法存在问题

Flose()在Docker容器中抛出段错误

C将数组传递给函数以修改数组

将回调/基于事件的C API转换为非回调API

pthread_create的用法

为四维数组中的Dim-1和Dim-3重新分配空间

不确定如何处理此编译错误

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

强制GCC始终加载常量(即只读),即使启用了优化

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

在C中打印指针本身

通过char*访问指针的对象表示是未定义的行为吗?

我错误地修复了一个错误,想了解原因

Ubuntu编译:C中的文件格式无法识别错误

在列表中查找素数

获取 struct 中匿名 struct 的大小