2013-04-10 39 views
1

当我宣布类似#define指令存储器

#define VAR 1 

,其中将1个值储存在哪里?我不认为在堆中,也不在堆栈中。是否可以在.bss部分?

+0

INT测试非常有用= VAR;和int test = 1;是相同的。预处理器不存储任何内容。 – Etherealone 2013-04-10 20:04:53

+6

它根本没有储存。预处理器只进行文本替换,即用文本“1”代替文本“VAR”的每一次出现。 – cnicutar 2013-04-10 20:05:02

回答

9

它不存储在任何地方。它仅在编译的预处理阶段使用。你可以把它看作是VAR的一个文本替换,在你的代码中使用1。完成此操作后,该宏本身不再存在于您的程序中。

考虑下面的例子:

#define VAR 1 
int x = VAR; 

这是简单地预处理成:

int x = 1; 

它是那么这个代码被编译为C++。所以宏观VAR根本没有占用任何空间。但是,由x定义的对象可能会非常好。

2

它存储在无论你实际使用VAR,因为你在这里定义的所有是预处理器的文本替换规则。

#define VAR 1 
int x = VAR; 

源编译之前,预处理器将在减少:

int x = 1; 

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

3

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

1

它只是#define VAR 1。所以只有...定义。它不会导致任何内存分配,它只能被预处理器用来修复所有具有定义值1的VAR的出现。只是一个文本概念。

1

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

1

如果您使用的是gcc,可以使用选项-E。有了这个选项,你可以看到执行#define语句的替代源代码的输出(也#包括等)

gcc -E whatever_file.c 

在调试复杂的宏