我试图实现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:那些是随机值或字符串地址。 (如下文所述)
答案 0 :(得分:2)
不,您要尝试做的事是不可能的。您无法在运行时按名称访问变量(字符串->变量),因为已编译的机器代码对C代码中的名称一无所知,并且您无法从编译器访问宏,因为编译器对宏一无所知(在编译器甚至没有看到代码之前就由预处理器进行了扩展。
换句话说,编译/执行分多个阶段进行:
#include
或#define
之类的指令,并扩展了宏)。简化示例:
// original C code
#define FOO 42
...
int x = y + FOO;
预处理后:
...
int x = y + 42;
编译后:
movl %ecx, %eax
addl $42, %eax
在第2步中没有FOO
的痕迹,最终代码对x
或y
一无所知。
诸如字符串之类的变量值仅在运行时的第3步中存在。您无法从那里返回到第1步。如果要在运行时访问有关宏的信息,则必须将其显式保留在某种数据结构中,但这都不是自动的。
答案 1 :(得分:0)
宏是简单的复制粘贴,并且非常有限。如果宏被引用或注释,则不会扩展。
一种解决方案是:
#define ABC "900"
char s[] = ABC;
但是,不能,宏不能用于您要尝试执行的操作。
当我尝试上面的代码时,而不是我想要的输出15,我得到6487568,我猜想该字符串的整数等效值。
这是未定义的行为。最有可能是字符串的地址。如果使用-Wall
进行编译,则会收到警告。