因此,我正在编写Lexer,遇到了我的宏生成令牌的问题(令牌是具有值类型(枚举)和值(联合)的结构。
#define MAKE_TOKEN(token, tokenType, valueType, tokValue) \
token.type=tokenType; \
token.value.type=valueType; \
switch(valueType){ \
case VAL_NIL: break; \
case VAL_BOOL: token.value.as.boolean=(bool)tokValue; break; \
case VAL_NUMBER: token.value.as.number=(double)tokValue; break; \
case VAL_STRING: token.value.as.string=(char*)tokValue; break; \
}
例如,如果tokValue为5(因为5可以转换为bool,double和char *),则此方法有效,但是由于编译器无法将字符串转换为double,因此无法编译。这意味着当值类型为VAL_STRING时无法使用此宏,如何解决此问题?
您不能使其作为宏工作,因为C预处理器中的宏仅执行字符串插值,因此麻烦的行会这样做:
case VAL_NUMBER: token.value.as.number=(double)"some_string"; break;
只需使用一个函数即可。没有明显的理由使该片段成为宏。