所以我有一个应用程序可以在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函数静态内联。
答案 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”无论如何,我想这将是一个老式的标题。