【问题标题】:How can I add Integer using '##' in C preprocessor?如何在 C 预处理器中使用“##”添加整数?
【发布时间】:2016-02-15 15:44:48
【问题描述】:
#include<stdio.h>

#define DEF6 625
#define DEF6 625
#define DEF(n) DEF##n

void main(){
    printf("%d\n", DEF(6));
}

此代码有效。 但是

#include<stdio.h>

#define DEF6 625
#define DEF(n) DEF##n

void main(){
    int a=6;
    printf("%d\n", DEF(a));
}

此代码不起作用。 错误结果是这样的

第 8 行:错误:未声明“DEFa”(在此函数中首次使用)
第 8 行:错误:(每个未声明的标识符只报告一次
第 8 行:错误:对于它出现的每个函数。)

那么如何使用## 将整数类型变量添加到#define

【问题讨论】:

  • ## 是连接运算符,而不是加法!
  • 您要解决的更大的问题是什么?
  • @Caleb:很好的问题,OP:你为什么要尝试实施这样的解决方案?

标签: c c-preprocessor stringification


【解决方案1】:

宏不会在运行时进行评估,您传递给宏的参数按字面意思使用,因为“它没有被评估”。你想要做的很容易用数组来实现。当有简单易行的解决方案时,不要试图强制错误的方法。

由于未评估 a,因此如果您通过 a,则使用 a

DEF(a)

替换为DEFa

这样做

#include <stdio.h>

static const int DEF[] = {[6] = 625};

int
main(void)
{
    int a = 6;
    printf("%d\n", DEF[a]);
}

【讨论】:

    【解决方案2】:

    这是不可能的。

    预处理器替换发生在代码编译之前。变量a 在那个时候没有任何值,它甚至不被识别为变量或类型。

    您将不得不使用一个整数常量,或者如第一个示例中所示的那样对该常量进行定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 2011-10-04
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多