与 gcc 中的 #define 相比,使用 typedef 对程序二进制文件有何影响?

ilo*_*ang -4 c compiler-construction

#define不会以任何方式影响二进制文件或目标文件,因为它是一个基本上复制粘贴内容的预处理器命令。

typedef由编译器处理,所以我想知道它可能会影响最终的二进制/对象文件,如果使用它,与#define.

Eri*_*hil 5

我的期望是typedef这样的:

\n
    \n
  • 编译器有一些用于类型数据结构的方案。当类型为 时int (*)[3],它具有某种结构,例如,表示 \xe2\x80\x9c 该类型是一个指针,这里是有关它指向的内容的更多信息,\xe2\x80\x9d 以及更多信息表示 \xe2 \x80\x9c此类型是一个包含 3 个元素的数组,这里是有关元素类型的更多信息,\xe2\x80\x9d 并且该进一步信息表示 \xe2\x80\x9c此类型是 . int\xe2\x80\x9d
  • \n
  • 当编译器处理 a 时typedef,它会记住类型信息(它保存上述数据结构)并将其与声明为类型别名的标识符相关联。
  • \n
  • 当编译器稍后看到该标识符时,它会用记忆的数据结构替换该类型。
  • \n
\n

因此,最终结果与标识符出现的所有地方再次使用了原始类型相同typedef(调整 C 规则以匹配,例如关于多次定义或不定义结构类型的规则)。

\n

然而,这仅适用于生成目标代码(或后来成为目标代码的中间代码)所需的编译器的活动。但编译器的作用远不止于此;它还记录调试信息。你说 \xe2\x80\x9c 预处理器宏就像复制粘贴,就像它们从未存在过一样,\xe2\x80\x9d 但这并不完全正确;编译器可能会记录有关宏的信息,以便它可以生成更好的诊断信息,帮助用户了解宏替换如何导致特定错误。您可以在一些 Clang 错误消息中看到这一点。同样,虽然编译器可能会用typedef类型信息替换名称,但它也可能会保留一些信息并将其包含在输出文件中以帮助调试。

\n