#定义指令内存存储

#define directive memory storage

本文关键字:存储 内存 指令 定义      更新时间:2023-10-16

当我声明像

#define VAR 1

1的值存储在哪里?我不认为在堆中,也不是堆栈。会在。bss部分吗?

没有存储在任何地方。它只在编译的预处理阶段使用。您可以将其看作是在代码中用1替换VAR的文本。在此之后,宏本身将不再存在于您的程序中。

考虑下面的例子:

#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符号在编译之前被有效地擦除。

只有#define VAR 1。所以只有……定义了。它不会引起任何内存分配,它只被预处理器用来替换所有出现的定义值为1的VAR。只是一个文本概念。

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

如果您正在使用gcc,您可以使用选项-E。使用此选项,您可以看到源代码的输出,其中执行了#define替换(还有#includes,等等)

gcc -E whatever_file.c

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