C ++打包一个typedef枚举

时间:2010-05-07 21:14:48

标签: c++ c enums compilation packing

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

当我尝试用C ++编译器编译它时,我收到错误,但它似乎与C编译器一起工作。所以这就是问题所在。是否可以用C ++打包枚举,或者有人能看出为什么我会收到错误?

错误是:

  声明“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不可能;寻找程序化解决方案。

7 个答案:

答案 0 :(得分:1)

#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)

中编译的

答案 1 :(得分:1)

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

如果您需要这种类型的控制,我会建议这样的事情:

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

不太漂亮,可能不太安全。但是有你想要的效果。 sizeof(BeNeLux) == 1并且您对该范围内的所有值都有一个命名常量。一个好的编译器甚至不会为static const整数值分配变量,只要你永远不会尝试使用它的地址。

答案 2 :(得分: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

答案 3 :(得分:0)

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

确保您的#define不是#if用于C ++代码,例如#ifndef __cplusplus

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

enum BeNeLux
{
   BELGIUM,
   NETHERLANDS,
   LUXEMBURG
};

这就是对C ++代码的期望。

答案 6 :(得分: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