【问题标题】:Are all functions in the c++ standard library required have external linkage?需要的c++标准库中的所有函数都有外部链接吗?
【发布时间】:2010-08-26 03:04:10
【问题描述】:

所以我有一个可以在 windows、linux 和一些 unix 变体上正常编译的应用程序。我最近遇到障碍时决定将其移植到 OSX。

我有一个看起来像这样的模板:

template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }

这个想法是防止符号扩展在给定高于0x7f 的输入值时使某些实现崩溃。它通常是这样使用的:

safe_ctype<std::isspace>(ch);

不幸的是,这在 OSX 上不起作用(使用 gcc 4.2)。该错误与std::isspace 没有外部链接有关,因此不适用于模板。事实证明,在 OSX 上,ctype.h 标头具有标记为static inline 的所有函数(通过宏)。

这是我的问题:

任何相关标准是否允许 C++ 标准库中的函数(在这种情况下是从 C 继承的部分)标准库中没有外部链接?

编辑:

我收到了苹果的回复。显然他们有一个宏来控制这种行为。定义 _DONT_USE_CTYPE_INLINE_ 可以防止 ctype 函数被静态内联。

【问题讨论】:

  • 在严格标准模式下编译也会得到标准行为。

标签: c++ c standard-library linkage


【解决方案1】:

C++03 §17.4.2.2/1 说:

C++ 标准库中的实体具有外部链接。

在 C 中也是如此:C99 §7.1.2/6 说:

库函数的任何声明都应具有外部链接。

【讨论】:

    【解决方案2】:

    OS X &lt;ctype.h&gt; 标头通过检查您是否未在标准模式下编译来保护非标准内联版本。

    如果你不告诉编译器你想要一致性,你就不会得到一致性。几乎所有平台都是如此,尽管方式不同。

    如果您想要扩展的所有细节,又不想要求严格的一致性,您可以在包含标头之前定义_DONT_USE_CTYPE_INLINE_,您将获得具有外部链接的函数的非内联版本.

    【讨论】:

      【解决方案3】:

      如何使用“cctype”(我的意思是在尖括号内)而不是“ctype.h”无论如何,我猜这将是一个老式的标题。

      【讨论】:

      • 我正在使用&lt;cctype&gt;,但错误源于包括&lt;ctype.h&gt;在内的错误。
      • 我已经向苹果 (bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/9/wo/…) 提交了错误报告。同时,我只是使用宏来直接调用函数,或者根据它是否在 OSX 上编译通过模板。不是一个理想的解决方案,但现在已经足够了。
      猜你喜欢
      • 2023-04-10
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2012-12-03
      • 2017-07-09
      • 2020-03-15
      相关资源
      最近更新 更多