【发布时间】:2020-02-12 08:40:51
【问题描述】:
C语言:
1.假设我有指令#bla。它未定义。是编译错误还是预处理错误?
2.假设我有 2 个 .c 文件:A.c、B.c(仅此而已。没有 .h 或其他任何文件。)。现在,假设在 A.c 中我在全局命名空间中有一个函数。 现在,我在 B.c 使用该功能(它不知道 a.c)。它会工作吗?链接器会填补空白吗?我是否需要添加 at A.c func 签名才能使用它?或者我可以使用它吗?
【问题讨论】:
-
不要粗鲁什么的,但你为什么不自己尝试一下呢?
-
@Eraklon 很粗鲁。
-
您是否尝试过使用无效指令进行编译?您是否尝试过按照您描述的方式链接目标文件?
-
问题 1 看起来像是编程老师问的一类问题。这是一个写得很糟糕的问题。就 C 标准而言,预处理是语言翻译的一部分。半个世纪前,预处理是一个单独的步骤。现代编译器可能会将预处理与其他编译步骤集成在一起,并且编译错误和预处理错误之间没有明确的区分——预处理错误就是编译错误。
-
源文件中存在
#bla是否是错误取决于C 实现。 C 标准不要求对其进行诊断。如果 C 2018 是这样的话,在 6.10 9 中,“执行非指令预处理指令会导致未定义的行为”。这意味着该标准没有强加任何要求,甚至没有关于诊断消息的要求。
标签: c compilation linker c-preprocessor