是否允许Concat的特殊标志,如+
,-
对于字符串连接宏##
?例如,
#define OP(var) operator##var
将OP(+)
扩大到operator+
?
#include "z3++.h"
#include <unordered_map>
namespace z3 {
z3::expr operator+(z3::expr const &, z3::expr const &);
}
typedef z3::expr (*MyOperatorTy)(z3::expr const &, z3::expr const &);
#define STR(var) #var
#define z3Op(var) static_cast<MyOperatorTy>(&z3::operator##var)
#define StrOpPair(var) \
{ STR(var), z3Op(var) }
void test() {
std::unordered_map<std::string, MyOperatorTy> strOpMap1{
{"+", static_cast<MyOperatorTy>(&z3::operator+)}}; // fine
std::unordered_map<std::string, MyOperatorTy> strOpMap2{StrOpPair(+)}; // error
}
对于strOpMap2
,使用clang++ -c -std=c++11
,它报告:
error: pasting formed 'operator+', an invalid preprocessing token
在使用时g++ -c -std=c++11
,它给出:
error: pasting "operator" and "+" does not give a valid preprocessing token
通过阅读gcc的手册,我发现应该可以进行合并了,但是为什么两个编译器都出错?
您可以粘贴标点符号以形成其他标点符号,例如
#define PASTE(a,b) a##b
int main()
{
int i = 0;
i PASTE(+,+);
// i == 1 now
}
该##
操作员是用于产生一个有效的令牌预处理从其它预处理标记。粘贴的结果必须是有效的预处理令牌。因此,这是无效的:
PASTE(i,++)
因为i++
不是预处理令牌;这是两个相邻的标记i
和++
。
可能的令牌列表为(N3797):
注意:在预处理阶段,关键字不存在;但经过预处理后,所有应作为关键字的标识符都将(语义地)转换为关键字。因此,您可以通过粘贴较短的单词来构建关键字。
在您的代码中,operator+
有两个标记:operator
和+
。因此,您不要使用##
;你只做一个然后另一个。
#define OP(punc) operator punc
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句