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

时间:2012-11-07 22:23:23

标签: c++ linker cross-platform standards

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

此时是否重要?如果库已经编译成目标代码,我甚至不处理实现定义的C ++ - 实际上,它甚至可能都没有用C ++编写。当我使用依赖于其自然平台的API时,如POSIX?

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

2 个答案:

答案 0 :(得分:2)

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

标准没有定义对程序“实现定义”意味着什么,所以我不能回答那个部分而不是说不,你的程序没有按照标准实现定义。它的行为是。

如果您使用来自Posix的函数调用,那么您的程序将取决于(该部分)Posix。这样的程序的行为不仅仅由C ++标准定义,因为C ++标准不知道或不关心Posix函数的作用。但是,给出了解Posix函数的功能,您可以使用C ++标准来计算整个程序的功能。所以行为可以由C ++标准定义,除了那些超出C ++标准范围的部分。

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

有一些灰色区域,无论Posix和其他OS功能是“程序的一部分”还是“实现的一部分”。以strdup为例,您可以在非Posix环境中轻松实现。如果它是“实现的一部分”,那么它的行为当然是实现定义的。如果它是“程序的一部分”那么程序的行为很好地依赖于程序,与每个C ++程序的行为一样! C ++标准并不关心你选择哪种方式来考虑它。

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

答案 1 :(得分:0)

如果该库是标准库的一部分,您可以假设它在任何标准符合平台上都可用,并且它的行为将按照其界面的指定进行。

如果没有,你不能。并且你不能假设它可以从该平台的源代码编译,或者以任何其他方式移植。然后,只需重新编译就无法将程序移植到该平台。编写没有实现定义行为的程序的目的是什么。