当我宣布类似
的内容时#define VAR 1
将存储1值的位置?我不认为在堆中,也不是堆栈..它可能在.bss部分吗?
答案 0 :(得分:9)
它没有存储在任何地方。它仅在编译的预处理阶段使用。在整个代码中,您可以将其视为VAR
的文本替换1
。完成此操作后,程序中不再存在宏。
考虑以下示例:
#define VAR 1
int x = VAR;
这只是预处理成:
int x = 1;
然后这个代码被编译为C ++。所以宏VAR
根本没有占用任何空间。但是,x
定义的对象很可能会这样做。
答案 1 :(得分:3)
#define
纯粹是一种预处理的人工制品。如果不使用宏,它的值甚至不会到达编译器。如果使用 ,那么您的问题的答案将取决于 的使用方式。
答案 2 :(得分:2)
它存储在中,只要你实际使用VAR
,因为你在这里定义的只是预处理器的文本替换规则。
#define VAR 1
int x = VAR;
在编译源代码之前,预处理器会将其减少为:
int x = 1;
在这种情况下,1
值存储在x
中。在编译之前,VAR
符号会被有效删除。
答案 3 :(得分:1)
仅#define VAR 1
。所以只...定义。它不会导致任何内存分配,只有预处理器才能使用定义值为VAR
的所有事件。只是一个文本概念。
答案 4 :(得分:1)
编译器将在生成目标代码时用值替换程序中使用的所有#define变量。
答案 5 :(得分:1)
如果您使用的是gcc,则可以使用选项-E。使用此选项,您可以看到源代码的输出,替换为执行#defines(也包括#includes等)
gcc -E whatever_file.c
在调试复杂的宏时非常有用