我有以下2个宏:
#define SCOPED_ENUM_HEADER(NAME) struct NAME{ enum _NAME{
#define SCOPED_ENUM_FOOTER(NAME) };}; typedef NAME::_NAME NAMEtype;
只有NAME的第一个实例被传递的NAME替换。怎么了?
以这种方式使用:
SCOPED_ENUM_HEADER(LOGLEVEL)
UNSET,
FILE,
SCREEN
SCOPED_ENUM_FOOTER(LOGLEVEL)
答案 0 :(得分:8)
问题是NAME
与_NAME
不同;它们是两个完全独立的标识符。
如果要在参数NAME
的前面添加下划线,请使用连接(##
)运算符:
_##NAME
但是,你需要非常小心地预先设置下划线。所有以下划线后跟大写字母开头的标识符都保留给实现。
答案 1 :(得分:1)
每个宏中只有一个NAME实例。你在每个宏中也有一个_NAME的例子,但是这是非常值得怀疑的:以下划线开头并且后面跟有大写字母的名字是为实现保留的,所以你可能会遇到问题。
但是,您想要获取NAME的值并将其连接到一起,假设将E_
放在前面。这有点棘手,因为_##NAME
通常会让你_NAME
,无论你输入什么。
这在C++ FAQ Lite上有解释,但你真正需要做的是:
#define REALLY_CONCATENATE(a,b) a ## b
#define CONCATENATE(a,b) REALLY_CONCATENATE(a,b)
#define SCOPED_ENUM_HEADER(NAME) struct NAME{ enum CONCATENATE("E_", NAME) {
(抱歉,现在无法测试)。
另一方面,必须有更好的方法来做你正在做的事情。严重。