【发布时间】: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