【问题标题】:C preprocessor replacement not workingC预处理器替换不起作用
【发布时间】:2017-08-08 20:35:10
【问题描述】:
#include <stdio.h>
#define VAR cc

int main(void) {
    int ccc = 9;
    printf("hell loo %d", VARc);
    return 0;
}

我对这段代码的理解意味着预处理器在任何地方找到VAR,它将用cc 替换它,因此printf 将有一个正确定义的变量ccc,但代码错误。有人可以帮忙吗


编辑 1

我得到的错误是

test.c: In function ‘main’:
test.c:16: error: ‘VARc’ undeclared (first use in this function)
test.c:16: error: (Each undeclared identifier is reported only once
test.c:16: error: for each function it appears in.)

【问题讨论】:

  • 错误信息是什么?
  • 请发布您的错误信息
  • 实际上想要达到什么目的?这看起来真的很像XY Problem
  • PSkocik 下面的回答是正确的,但这或多或少是对预处理器的滥用。如果您告诉我们您的实际用例是什么,那么我们可能会建议一个更好的解决方案。

标签: c c-preprocessor preprocessor


【解决方案1】:

这不起作用的原因是:

标记化先于预处理,换句话说,从预处理文件中识别标记出现在宏扩展之前。

由于CPP 是贪婪的,它会将VARc 视为与标识符类别相关的单个标记,与宏定义中的VAR 不同。这就是它不能被替换的原因。

因此一种解决方案是使用连接或为VARc 创建另一个宏。

【讨论】:

    【解决方案2】:

    那是行不通的。预处理器适用于整个标记,而不是字符串。

    如果你想要串联,你可以这样做:

    #include <stdio.h>
    #define VAR(End) cc##End // ## does token concatenation inside a pp macro
    
    int main(void) {
        int ccc = 9;
        printf("hell loo %d", VAR(c));
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-30
      • 2013-03-18
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2021-11-21
      相关资源
      最近更新 更多