gpt4 book ai didi

c++ - C++ 标准如何适应与平台相关组件的链接?

转载 作者:行者123 更新时间:2023-11-28 03:28:27 26 4
gpt4 key购买 nike

在编写程序时,我的目标是避免任何未指定或实现定义的行为。当链接到 C++ 库时,我希望它们以类似的方式编写。如果我链接到一个在编译时使用实现定义行为的库,是否会立即使我自己的程序根据标准实现定义?

在这一点上还重要吗?如果库已经被编译为目标代码,我什至不会处理实现定义的 C++——事实上,它甚至可能不是用 C++ 编写的。当我使用本质上依赖于平台的 API(例如 POSIX)时怎么样?

标准的编写方式似乎假定我的“C++ 程序”完全由我编写,不涉及其他预编译组件。它如何容纳这些组件的链接,标准在什么时候停止关心我的程序做什么?

最佳答案

如果您调用具有未指定(或实现定义或未定义)行为的函数,则您的程序具有未指定(或实现定义或未定义)的行为。

该标准没有定义程序“由实现定义”的含义,因此除了说不,我无法回答该部分,您的程序不是根据标准实现定义的。它的行为是。

如果您使用从 Posix 调用函数,那么您的程序依赖于 Posix(的那部分)。这种程序的行为不是由 C++ 标准单独定义的,因为 C++ 标准不知道也不关心 Posix 函数的作用。但是,鉴于 Posix 函数的作用,您可以使用 C++ 标准来计算出整个程序的作用。所以行为可以由 C++ 标准定义,除了 C++ 标准范围之外的部分。

在某些情况下,您可以通过链接到一个库而不调用其中的代码来使您的程序具有未定义的行为。违反单一定义规则就是一个明显的例子。就标准而言,您有权定义一个名为 pthread_create 的函数,但如果您将该程序链接到 pthreads,就会出现未定义的行为。

Posix 和其他 OS 函数是“程序的一部分”还是“实现的一部分”,这是一个灰色地带。以 strdup 为例,您可以在非 Posix 环境中自行轻松实现它。如果它是“实现的一部分”,那么它的行为当然是实现定义的。如果它是“程序的一部分”,那么程序的行为,好吧,取决于程序,与每个 C++ 程序的行为一样! C++ 标准并不真正关心您选择哪种方式来思考它。

该标准不假设一个程序有多少作者。如果您使用的组件已记录在案,那么作为将最终程序放在一起的人,您有责任确定您是否以某种方式使用它们,使您的程序行为如您所愿.如果他们没有记录在案,或者他们的行为不像他们的文件所说的那样,那么你可能想向他们的作者提出一个案例,他们有责任对此做些什么;- )

关于c++ - C++ 标准如何适应与平台相关组件的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13279291/

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