2012-05-30 96 views
5

如果我在C代码中使用宏,如宏在哪里存储?

#define var 10 

然后在那里究竟是存储在由内核分配给进程的空间? 在堆或BSS或全局数据?或者它只是一个编译器通行证中var的文本替换?

回答

14

是的。
最后一个

只是一个文本替换

它是由一个预处理通执行。 一些好的细节可以发现here

+0

我不认为文本替换是相当公平的。它可以处理参数列表等。 –

+0

是的。宏对许多事情都很有用。 op对于cpp pass有点模糊。文本替换是发生了什么。 – EvilTeach

+0

@AndrewWhite:预处理器很复杂,但它仍然只是进行文本到文本的转换。例如,在unix系统中,可以独立于编译器运行预处理器,甚至可以将C预处理器用于某些非C文件。 – hugomg

4

预处理指令一样#define将替换在编译的预处理阶段相应的文本,并(几乎)从来没有在最终的可执行表示。

0

这是编译器的指令,因此存储在编译器进程空间的表中,而不是代码空间中。

+0

编译器从来没有看到它。预处理器通过吃掉它。 – EvilTeach

3

“宏”是一个“编译时的事情”。

它在编译之前只是“替换了编译器看到的文本”。

结果(在编译代码中)可以是一组操作......数据声明......或者根本没有。

但是,“宏”本身是预处理器完成后,编译实际上开始之前的古代史。

0

宏只是文本替换。当被代替时,这些成为代码​​的一部分,并因此被存储在代码段中。