0

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

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

该标准的编写方式似乎假设我的“C++ 程序”完全由我编写,不涉及其他预编译组件。它如何适应这些组件的链接以及标准在什么时候不再关心我的程序的功能?

4

2 回答 2

2

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

该标准没有定义程序“实现定义”的含义,所以我不能回答那部分,只能说不,您的程序不是根据标准实现定义的。它的行为是。

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

在某些情况下,您只需链接到库即可使程序具有未定义的行为,而无需调用其中的代码。违反单一定义规则就是一个明显的例子。就标准而言,您有权定义一个名为 的函数pthread_create,但如果您将该程序与 pthread 链接,您将有未定义的行为。

无论 Posix 和其他操作系统功能是“程序的一部分”还是“实现的一部分”,都存在灰色地带。例如strdup,您可以在非 Posix 环境中轻松实现。如果它是“实现的一部分”,那么它的行为当然是实现定义的。如果它是“程序的一部分”,那么程序的行为就取决于程序,与每个 C++ 程序的行为一样!C++ 标准并不真正关心您选择哪种方式来考虑它。

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

于 2012-11-07T22:35:24.873 回答
0

如果该库是标准库的一部分,您可以假设它在任何符合标准的平台上都可用,并且它的行为将与它的接口有关。

如果没有,你不能。而且您不能假设它可以从该平台的源代码编译,或以任何其他方式移植。然后,您不能仅通过重新编译将程序移植到该平台。这是编写没有实现定义行为的程序的目的。

于 2012-11-07T22:40:35.677 回答