我可以使用字符串作为宏在C中传递该宏的值吗?

时间:2019-06-26 05:35:19

标签: c macros

我试图实现C将我的字符串解释为宏。

嘿,我们假设有一个已定义的宏,

#define ABC 900

如果我定义;

char* s[] = "ABC" ; 

然后

printf("%d",s) ; 

编译器是否可以通过某种方式将“ ABC”理解为宏ABC并将900整数值传递给printf?

#include<stdio.h>
#define abc 15

int main(void) {

    char a[] = "abc" ;

    printf("%d",a); 


    return 0;
}

当我尝试上面的代码时,而不是我想要的输出15,我得到6487568,我猜想该字符串的整数等效值。

Edit:那些是随机值或字符串地址。 (如下文所述)

2 个答案:

答案 0 :(得分:2)

不,您要尝试做的事是不可能的。您无法在运行时按名称访问变量(字符串->变量),因为已编译的机器代码对C代码中的名称一无所知,并且您无法从编译器访问宏,因为编译器对宏一无所知(在编译器甚至没有看到代码之前就由预处理器进行了扩展。

换句话说,编译/执行分多个阶段进行:

  1. C源代码经过预处理(摆脱了#include#define之类的指令,并扩展了宏)。
  2. 经过预处理的令牌流被传递给编译器,编译器将其转换为机器代码(可运行程序)。
  3. 最后程序运行。

简化示例:

// original C code
#define FOO 42
...
int x = y + FOO;

预处理后:

...
int x = y + 42;

编译后:

movl %ecx, %eax
addl $42, %eax

在第2步中没有FOO的痕迹,最终代码对xy一无所知。

诸如字符串之类的变量值仅在运行时的第3步中存在。您无法从那里返回到第1步。如果要在运行时访问有关宏的信息,则必须将其显式保留在某种数据结构中,但这都不是自动的。

答案 1 :(得分:0)

宏是简单的复制粘贴,并且非常有限。如果宏被引用或注释,则不会扩展。

一种解决方案是:

#define ABC "900"
char s[] = ABC; 

但是,不能,宏不能用于您要尝试执行的操作。

  

当我尝试上面的代码时,而不是我想要的输出15,我得到6487568,我猜想该字符串的整数等效值。

这是未定义的行为。最有可能是字符串的地址。如果使用-Wall进行编译,则会收到警告。