如果您调用具有未指定(或实现定义或未定义)行为的函数,则您的程序具有未指定(或实现定义或未定义)行为。
该标准没有定义程序“实现定义”的含义,所以我不能回答那部分,只能说不,您的程序不是根据标准实现定义的。它的行为是。
如果你使用从 Posix 调用函数,那么你的程序依赖于 Posix 的(那部分)。这种程序的行为不是由 C++ 标准单独定义的,因为 C++ 标准不知道也不关心 Posix 函数的作用。但是,如果了解 Posix 函数的作用,您可以使用 C++ 标准来计算整个程序的作用。所以行为可以由 C++ 标准定义,除了 C++ 标准范围之外的部分。
在某些情况下,您只需链接到库即可使程序具有未定义的行为,而无需调用其中的代码。违反单一定义规则就是一个明显的例子。就标准而言,您有权定义一个名为 的函数pthread_create
,但如果您将该程序与 pthread 链接,您将有未定义的行为。
无论 Posix 和其他操作系统功能是“程序的一部分”还是“实现的一部分”,都存在灰色地带。例如strdup
,您可以在非 Posix 环境中轻松实现。如果它是“实现的一部分”,那么它的行为当然是实现定义的。如果它是“程序的一部分”,那么程序的行为就取决于程序,与每个 C++ 程序的行为一样!C++ 标准并不真正关心您选择哪种方式来考虑它。
该标准不假设程序有多少作者。如果您使用的组件已记录在案,那么作为将最终程序组合在一起的人,您有责任确定您是否以某种方式使用它们以使您的程序行为符合您的定义. 如果他们没有记录,或者他们的行为不像他们的文档所说的那样,那么你可能想向他们的作者提出一个案例,他们有责任对此做些什么;-)