【问题标题】:C preprocessor assigning value to multiple typesC预处理器为多种类型赋值
【发布时间】:2019-11-22 21:51:08
【问题描述】:

所以我正在编写一个 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 时无法使用此宏,我该如何解决?

【问题讨论】:

  • 我不明白你的解释。您可以添加更多信息和/或更好地解释吗?您的示例中没有double。
  • 为什么这是宏而不是函数?

标签: c string macros preprocessor lexer


【解决方案1】:

你不能让它像宏一样工作,因为 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;
    }
}

【讨论】:

  • 应该是token-> 而不是token.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多