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

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

错误是:

“在宣布比荷卢经济联盟后缺少分号”。

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

附录:

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

_ASSOCIATIONS_不是比荷卢经济联盟的一种:

#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 是不可能的;寻找程序化解决方案。

4

7 回答 7

4

更新:

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

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只要您从不尝试使用它的地址,一个好的编译器甚至不会为整数值分配变量。

于 2010-05-25T17:28:37.077 回答
2
#if defined (__GNUC__)
#  if defined (__cplusplus)
#     define _ASSOCIATIONS_(X) __attribute__((packed))
#  else
#     define _ASSOCIATIONS_(X) __attribute__((packed)) X
#  endif
#else
#  if defined (__cplusplus)
#     define _ASSOCIATIONS_(X)
#  else
#     define _ASSOCIATIONS_(X) X
#  endif
#endif

typdef enum BeNeLux {
  BELGIUM,
  NETHERLANDS,
  LUXEMBURG
} _ASSOCIATIONS_ (BeNeLux);

这似乎在我的g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)

于 2010-05-25T16:56:46.990 回答
1

这里没有真正的突破。我只是重新排序,希望您的编译器会更喜欢它。我没有你的 gcc 或 g++ 版本,所以我无法用它们进行测试。我确实通过版本 3.4.5 gcc 和 g++ (mingw special) 运行了它,它们'packed' attribute ignored在像您的代码一样订购时都会发出警告,但没有抱怨我的。

#ifdef __GNUC__
#define attribute(x) __attribute__((x));
#else
#define attribute(x)
#endif


#ifdef __cplusplus
extern "C" {
#endif

enum BeNeLux
{
    BELGIUM,
    NETHERLANDS,
    LUXEMBURG
} attribute(packed);
// I declared attribute to look like a f() so that it would not look like I was
// declaring a variable here.

#ifndef __cplusplus
typedef enum BeNeLux BeNeLux; // the typedef is separated into a separate stmt
#else
}
#endif
于 2010-05-26T04:13:57.223 回答
0

我想你正在使用 GCC 和 G++。对我来说,代码可以很好地编译。当在任何一个特定的编译器上启用 C++ 时,看到这样一个特性消失了,这将是相当令人惊讶的。

确保您的 C++ 代码#define没有被#if淘汰,例如#ifndef __cplusplus.

尝试g++ -E查看预处理器输出并验证是否#define出现。

此外,即使对于预处理器宏,以下划线和大写字母或两个下划线开头的名称也保留给编译器和库。如果你必须有一个宏,PACKED可能是它的最佳名称。

于 2010-05-07T21:18:01.207 回答
0

在 C++ 中,您不需要typedef. 刚开始enum BeNeLux。也有可能(我永远不记得)声明具有相同标识符的类型和变量在其中一种语言中可能是不合法的。

于 2010-05-07T21:41:56.897 回答
0
enum BeNeLux
{
   BELGIUM,
   NETHERLANDS,
   LUXEMBURG
};

这是 C++ 代码所期望的。

于 2010-05-07T21:43:35.427 回答
0
#if defined (__GNUC__)

#  if defined (__cplusplus)
#     define ENUM enum
#  else
#     define ENUM typedef enum
#  endif

#  if defined (__cplusplus)
#     define _ASSOCIATIONS_(X) __attribute__((packed))
#  else
#     define _ASSOCIATIONS_(X) __attribute__((packed)) X
#  endif
#else
#  if defined (__cplusplus)
#     define _ASSOCIATIONS_(X)
#  else
#     define _ASSOCIATIONS_(X) X
#  endif
#endif

ENUM BeNeLux {
  BELGIUM,
  NETHERLANDS,
  LUXEMBURG
} _ASSOCIATIONS_ (BeNeLux);

另一个片段。见新#define ENUM

于 2010-05-26T19:17:16.560 回答