![](/img/trans.png)
[英]Does the C++ standard define if in-function definitions of member functions in structs must have static linkage?
[英]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.