C ++宏没有替换所有值

时间:2010-04-22 16:21:29

标签: c++ macros c-preprocessor

我有以下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)

2 个答案:

答案 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) {

(抱歉,现在无法测试)。

另一方面,必须有更好的方法来做你正在做的事情。严重。