C预处理器为多个类型赋值

C预处理器为多个类型赋值,c,string,macros,preprocessor,lexer,C,String,Macros,Preprocessor,Lexer,因此,我正在编写一个Lexer,我的宏在生成令牌(令牌是一个具有值类型(enum)和值(union)的结构)时遇到了一个问题 例如,如果tokValue为5,则此选项有效(因为5可以转换为bool、double和char*)但是,这不会编译,因为编译器无法将字符串转换为double。这意味着当值类型为VAL_string时,无法使用此宏,如何解决此问题?由于C预处理器中的宏仅执行字符串插值,因此麻烦的行会: case VAL_NUMBER: token.value.as.number=(

因此,我正在编写一个Lexer,我的宏在生成令牌(令牌是一个具有值类型(enum)和值(union)的结构)时遇到了一个问题


例如,如果tokValue为5,则此选项有效(因为5可以转换为bool、double和char*)但是,这不会编译,因为编译器无法将字符串转换为double。这意味着当值类型为VAL_string时,无法使用此宏,如何解决此问题?

由于C预处理器中的宏仅执行字符串插值,因此麻烦的行会:

    case VAL_NUMBER: token.value.as.number=(double)"some_string"; break;
只需使用一个函数就可以了。没有明显的理由让这个片段成为一个宏

void MAKE_TOKEN(struct token *token, enum token_type tokenType, enum value_type valueType, void *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;
    }
}

我不理解您的解释。您能添加更多信息和/或更好地解释吗?您的示例中没有
double
。为什么这是一个宏而不是一个函数?应该是
token->
而不是
token。
void MAKE_TOKEN(struct token *token, enum token_type tokenType, enum value_type valueType, void *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;
    }
}