如何在C预处理器中使用'##'添加Integer?

时间:2016-02-15 15:44:48

标签: c c-preprocessor stringification

#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

将Integer类型变量添加到##

2 个答案:

答案 0 :(得分:6)

宏在运行时不会被评估,传递给宏的参数字面上会被使用,因为“它未被评估”。您想要做的事情很容易用数组来完成。当有简单易用的解决方案时,不要试图强迫错误的方法。

由于未评估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]);
}

答案 1 :(得分:1)

无法做到。

在编译代码之前进行预处理器替换。变量a此时没有任何值,甚至不会将其识别为变量或类型。

您将必须使用整数常量,或者如第一个示例中所示的那个常量的定义。