【问题标题】:Linker / Compiler / Pre-processing question [closed]链接器/编译器/预处理问题[关闭]
【发布时间】: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


【解决方案1】:

您无需添加函数签名即可使用它。 B.c 不需要知道关于 A.c 中定义的函数的任何信息。链接器将填补空白。如果您的项目链接器中的 B.c 和 A.c 都将匹配您在 B.c 中使用的 A.c 中的函数

但是编译器会警告您缺少函数声明。

# 指令与预处理步骤有关。所以这是预处理错误而不是实际的编译错误。

【讨论】:

  • 不过,这可能会失败。编译器假定未声明函数的返回类型为int,但这可能与函数的实际返回类型不匹配(可能是双精度、长整型或更大的结构)。很确定编译器不会在堆栈上为返回值分配足够的内存,至少你几乎肯定会得到意想不到的结果。参数也无法检查,您也可能会陷入混乱。我希望调用具有这种不匹配的函数是未定义的行为,但我不确定......
  • @Aconcagua 你说得对。但问题不在于什么更好或不更好。问题是,能不能。
  • 嗯,字面意思是 'Would it work?' - 现在很大程度上取决于你如何定义 'to work',你似乎在这个问题上远没有我那么严格;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多