繁体   English   中英

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

[英]Are all functions in the c++ standard library required have external 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函数成为静态内联函数。

C ++03§17.4.2.2/ 1说:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM