1

当我声明类似

#define VAR 1

1 值将存储在哪里?我不认为在堆中,也不在堆栈中..它可以在 .bss 部分吗?

4

6 回答 6

9

它没有存储在任何地方。它仅在编译的预处理阶段使用。您可以将其视为在整个代码中替换为VARwith的文本。1完成此操作后,宏本身不再存在于您的程序中。

考虑以下示例:

#define VAR 1
int x = VAR;

这被简单地预处理为:

int x = 1;

然后将这段代码编译为 C++。所以宏VAR根本不占用任何空间。但是,由 定义的对象x可能很好。

于 2013-04-10T20:05:58.730 回答
3

#define纯粹是一个预处理人工制品。如果不使用宏,它的值甚至不会到达编译器。如果使用它那么您问题的答案将取决于的使用方式。

于 2013-04-10T20:06:04.300 回答
2

它存储在您实际使用的任何地方VAR,因为您在这里定义的只是预处理器的文本替换规则。

#define VAR 1
int x = VAR;

在编译源代码之前,预处理器会将其减少为:

int x = 1;

在这种情况下,该1值存储在x. 该VAR符号在编译之前被有效擦除。

于 2013-04-10T20:05:56.607 回答
1

如果您使用的是 gcc,则可以将其与选项 -E 一起使用。使用此选项,您可以看到源代码的输出,其中执行了 #defines 替换(还有 #includes 等)

gcc -E whatever_file.c

在调试复杂的宏时非常有用

于 2013-04-10T20:34:28.910 回答
1

编译器将在生成目标代码时将程序中使用的所有#define 变量替换为值。

于 2013-04-10T20:08:30.270 回答
1

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.

于 2013-04-10T20:07:29.780 回答