当我声明类似
#define VAR 1
1 值将存储在哪里?我不认为在堆中,也不在堆栈中..它可以在 .bss 部分吗?
它没有存储在任何地方。它仅在编译的预处理阶段使用。您可以将其视为在整个代码中替换为VAR
with的文本。1
完成此操作后,宏本身不再存在于您的程序中。
考虑以下示例:
#define VAR 1
int x = VAR;
这被简单地预处理为:
int x = 1;
然后将这段代码编译为 C++。所以宏VAR
根本不占用任何空间。但是,由 定义的对象x
可能很好。
这#define
纯粹是一个预处理人工制品。如果不使用宏,它的值甚至不会到达编译器。如果使用它,那么您问题的答案将取决于它的使用方式。
它存储在您实际使用的任何地方VAR
,因为您在这里定义的只是预处理器的文本替换规则。
#define VAR 1
int x = VAR;
在编译源代码之前,预处理器会将其减少为:
int x = 1;
在这种情况下,该1
值存储在x
. 该VAR
符号在编译之前被有效擦除。
如果您使用的是 gcc,则可以将其与选项 -E 一起使用。使用此选项,您可以看到源代码的输出,其中执行了 #defines 替换(还有 #includes 等)
gcc -E whatever_file.c
在调试复杂的宏时非常有用
编译器将在生成目标代码时将程序中使用的所有#define 变量替换为值。
It is only #define VAR 1
. so only... defines. It will not cause any memory allocation, it is used only by a preprocessor to sabstitute all ocurrences of VAR
with defined value 1. Just a textual concept.