我想将 MyNamespace::附加到宏定义的函数中:
#define transFunc(func) \
dimensionedScalar func(const dimensionedScalar& ds) \
{ \
if (!ds.dimensions().dimensionless()) \
{ \
FatalErrorIn(#func "(const dimensionedScalar& ds)") \
<< "ds not dimensionless" \
<< abort(FatalError); \
} \
\
return dimensionedScalar \
( \
#func "(" + ds.name() + ')', \
dimless, \
MyNameSpace::##func(ds.value()) \
);
\
但是当我打电话的时候
transFunc(Foo)
编译器抛出以下错误:
pasting "::" and "Foo" does not give a valid preprocessing token
我上面连接标记的方式有什么问题?
最佳答案
##
用于将两个标记组合在一起以形成单个标记。所以像 func##1
这样的东西会扩展为单个标记 func1
。
在此处使用它,它会尝试将 ::
和 Foo
结合在一起以生成单个标记 ::Foo
。正如错误所说,这不是有效的 token 。您不需要这里的单个 token ;您只想将两个标记分开:
MyNameSpace::func(ds.value())
关于c++ - 粘贴 "::"和 "Foo"不会提供有效的预处理 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361170/