gpt4 book ai didi

c - 调用第三方库函数(未作为源代码提供)是未定义的行为吗?

转载 作者:行者123 更新时间:2023-12-02 08:52:12 25 4
gpt4 key购买 nike

在 C 中调用第 3 方库函数(未作为源代码提供)是未定义的行为吗?

我的意思是:

  • 不调用标准 C 库。
  • 不调用编译器供应商提供的附加库。
  • 不调用我使用 C 编译器创建的库。
  • 不调用作为源代码提供的第 3 方库,我自己使用 C 编译器编译了库。
  • 不调用预编译的第 3 方库,我知道它是使用我正在使用的完全相同的 C 编译器编译的。

换句话说,我对以某种方式依赖于 ABI 兼容性的场景感兴趣(可能在不同的 C 编译器之间,或同一 C 编译器的不同版本之间,或在不同语言的编译器之间)。 C 标准没有说明如何实现 ABI 兼容性。

我主要对 C90 感兴趣,它在第 3.16 节中指出:

Undefined behavior is otherwise indicated in this International Standard by the words "undefined behavior" or by the omission of any explicit definition of behavior.

可以说调用第三方库函数是未定义的行为,因为上面的子句中“省略了任何显式定义”部分。

也有人认为调用第 3 方库函数不是实现定义的行为,因为该库不是由编译器供应商提供的。

如果调用第 3 方库函数确实是未定义行为,则意味着 C 中存在 2 级未定义行为,并且避免所有未定义行为的建议过于简单化。我们如何知道哪些类型的未定义行为是“OK”的,哪些类型可能被编译器编写者视为为了改进基准测试结果而做“任何事情”的机会?

编辑:我编辑了问题和标题以澄清我排除了我自己编译库的情况。我认为这不会改变问题的含义,因为我认为大多数第 3 方库都以预编译形式使用。

最佳答案

来自 C 标准(再次:)

5.1.1.1 程序结构
1 一个C程序不需要全部同时翻译。程序的文本保存在本国际标准中称为源文件(或预处理文件)的单元中。通过预处理指令 #include 包含的源文件以及所有头文件和源文件被称为预处理翻译单元。经过预处理后,预处理翻译单元称为翻译单元。以前翻译的翻译单元可以单独保存或保存在库中。程序的独立翻译单元通过(例如)调用其标识符具有外部链接的函数、对其标识符具有外部链接的对象的操作或对数据文件的操作进行通信。翻译单元可以单独翻译,然后链接以生成可执行程序。

据我所知,翻译/编译和链接的具体完成方式超出了标准,因此,这些库是否包含编译代码取决于实现。

关于c - 调用第三方库函数(未作为源代码提供)是未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7725973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com