【发布时间】:2014-08-01 02:57:30
【问题描述】:
小问题:
字符串拼接宏##是否允许拼接+、-等特殊符号?例如,
#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
通过阅读the manual by gcc,我发现应该可以连接,但为什么两个编译器都会发出错误?
【问题讨论】:
-
operator +是 两个 令牌,而不是一个。 -
@DavidRodríguez-dribeas 所以 concat 宏结果只会是一个令牌?为什么
operator +是两个令牌?operator和+应该被识别为一个操作符函数,对吧? -
operator是一个关键字。要得到你想要的,#define OP(var) operator var -
@MattMcNabb 谢谢,这行得通!