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