所需的c ++标准库中的所有函数都有外部链接吗?

时间:2010-08-26 03:04:10

标签: c++ c standard-library linkage

所以我有一个应用程序可以在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函数静态内联。

3 个答案:

答案 0 :(得分:18)

C ++03§17.4.2.2/ 1说:

  

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

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

  

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

答案 1 :(得分:3)

OS X <ctype.h>标题通过检查您是否在标准模式下进行编译来保护非标准内联版本。

如果您没有告诉编译器您需要一致性,则不会达到一致性。几乎所有平台都是如此,但方式不同。

如果你想要扩展的所有细节,什么不是,所以不想要求严格的一致性,你可以在包含标题之前定义_DONT_USE_CTYPE_INLINE_,你将得到函数的非内联版本外部联系。

答案 2 :(得分:0)

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