繁体   English   中英

C ++宏不会替换所有值

[英]C++ Macro is not replacing all values

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

问题在于NAME_NAME 它们是两个完全独立的标识符。

如果要在参数NAME的前面添加下划线,请使用串联( ## )运算符:

_##NAME

但是,您确实需要非常小心地使用下划线。 所有以下划线开头,大写字母开头的标识符均保留给实现。

每个宏中只有一个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) {

(抱歉,暂时无法测试)。

另一方面,必须有一种更好的方式来做您正在做的事情。 说真的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM