宏存储在哪里?

6
如果我在我的C代码中使用宏,例如

#define var 10

那么它们究竟存储在内核为进程分配的空间中的哪里呢? 在堆、BSS或全局数据中吗?还是它只是编译器通过之一的var文本替换?

5个回答

15

是的。
最后一个

只是文本替换

它是由预处理步骤执行的。 一些好的细节可以在这里找到


我认为文本替换并不太公平。它可以与参数列表等一起使用。 - Andrew White
是的。宏在许多方面都很有用。关于cpp传递,操作有点模糊。发生的是文本替换。 - EvilTeach
@AndrewWhite:预处理器很复杂,但它仍然只是进行文本到文本的转换。例如,在Unix系统中,可以将预处理器与编译器分开运行,甚至可以使用C预处理器处理一些非C文件。 - hugomg
@AndrewWhite:文本替换是相当公平的。对于带有参数列表的宏,从宏参数中计算出插入到宏调用位置的文本的规则可能会相当复杂,但基本上所有的宏展开都只是用另一个预处理器标记序列替换一个序列(如果有参数,则在预处理时从第一个序列计算)。 - Steve Jessop

5

#define 这样的预处理指令,会在编译时的预处理阶段被替换为相应的文本,并且 (几乎) 不会在最终的可执行文件中表示出来。


4

“宏”是一个“编译时的东西”。在编译之前,它只是“替换编译器看到的文本”。编译后的结果可能是一组操作、数据声明或什么都没有。

但是,在预处理器完成之后,编译实际开始之前,“宏”本身就成为了远古历史。


2

宏仅是文本替换。当被替换时,它们成为代码的一部分,因此存储在代码段中。


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

1
编译器从未看到它,预处理器会将其去除。 - EvilTeach
点赞的回答和评论,从技术上讲,评论是正确的,但从实际操作来看,普通用户无法区分两者之间的差异。构建通常使用单个命令完成,其中预处理被隐含。 - ysap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接