【发布时间】:2016-07-21 20:34:40
【问题描述】:
我有以下代码在 msvc 2015 下工作:
#define CLASS_JS_PSG_PROPERTY_EX(PROPERTY, VALUE) \
static bool Get##PROPERTY(/*irrelevant params here...*/) \
{ \
...
some particular code
...
return true; \
}
#define CLASS_JS_PSG_PROPERTY(VALUE) \
CLASS_JS_PSG_PROPERTY_EX(##VALUE, VALUE)
...
#define kProp 1
CLASS_JS_PSG_PROPERTY_EX(Version, kProp)
CLASS_JS_PSG_PROPERTY(kProp)
这应该定义名为 GetVersion 和 GetkProp 的方法。
现在,这在 gcc C++14(实际上是 TDM-GCC-64)下会出现以下错误:
pasting "(" and "kProp" does not give a valid preprocessing token
应该如何编写才能在gcc C++14和msvc 2015下编译?
【问题讨论】:
-
试试
CLASS_JS_PSG_PROPERTY_EX(VALUE, VALUE)。 -
在这种情况下,它会尝试生成名称为
Get"Version"或Get"kProp"的函数。 -
这应该只发生在
#VALUE,而不是VALUE。 -
我的错,我想说 Version 或 kProp 的内容在那里。容器宏会将参数替换为它们的内容并将它们传递给内部宏(如果它们是字符串,则作为字符串,如果它们是具有 1 作为值的 int,则作为“1”)。
-
见
#define kProp 1。它已经过预处理,因此不会使用名称kProp,而是使用值1。
标签: c++ gcc visual-c++