gpt4 book ai didi

C++ 打包 typedef 枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:05 25 4
gpt4 key购买 nike

typedef enum BeNeLux
{
BELGIUM,
NETHERLANDS,
LUXEMBURG
} _ASSOCIATIONS_ BeNeLux;

当我尝试使用 C++ 编译器编译它时,出现错误,但它似乎可以在 C 编译器上正常工作。所以问题来了。是否可以在 C++ 中打包枚举,或者有人能看出我为什么会收到错误消息吗?

错误是:

"semicolon missing after declaration of BeNeLux".

我知道,在检查和重新检查之后,那里肯定有一个分号,并且在代码其余部分需要的任何地方。

附录:

_PACKAGE_ 只是一个例子。我正在重命名它。

_ASSOCIATIONS_ 不是 BeNeLux 的一种:

#define _ASSOCIATIONS_ __attribute__((packed))

代码是 iffed,但只是为了确保它是 GNU C/C++。

#if defined (__GNUC__) 
#define _ASSOCIATIONS_ __attribute__((packed))
#else
#define _ASSOCIATIONS_

这会引起问题吗?我认为 (GNUC) 适用于 C 和 C++

附录 2:

我试过了

#ifdef __cplusplus
extern "C" {
#endif

typedef enum BeNeLux
{
BELGIUM,
NETHERLANDS,
LUXEMBURG
} _ASSOCIATIONS_ BeNeLux;

#ifdef __cplusplus
}
#endif

没有快乐。有人吗?

注意:-fshort-enums 是不可能的;寻找程序化解决方案。

最佳答案

更新:

对于 C++11 及更高版本,您可以指定 enum 的基础类型。例如:

enum BeNeLux : uint8_t {
BELGIUM,
NETHERLANDS,
LUXEMBURG
};

但这仅适用于代码仅为 C++ 的情况。如果代码需要同时兼容 C 和 C++,我相信我原来的答案仍然适用。


我不认为这里有什么可以完全您想要的。我假设您正在尝试创建一个类型,该类型是枚举范围的最小类型。

如果你需要这种类型的控制,我会推荐这样的东西:

typedef unsigned char BeNeLux;
static const BeNeLux BELGIUM = 0;
static const BeNeLux NETHERLANDS = 1;
static const BeNeLux LUXEMBURG = 2;

不是那么漂亮,而且类型安全性可能稍差。却有你想要的效果。 sizeof(BeNeLux) == 1 并且您对范围内的所有值都有一个命名常量。一个好的编译器甚至不会为 static const 整数值分配变量,只要您从不尝试使用它的地址即可。

关于C++ 打包 typedef 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com