[英]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.