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 函数是静态内联的。

4

3 回答 3

18

C++03 §17.4.2.2/1 说:

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

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

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

于 2010-08-26T03:06:15.063 回答
3

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

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

如果您想要扩展的所有细节以及不想要的东西,并且不想要求严格的一致性,您可以_DONT_USE_CTYPE_INLINE_在包含标题之前定义,您将获得具有外部链接的函数的非内联版本。

于 2010-08-27T21:07:15.600 回答
0

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

于 2010-08-26T03:18:53.040 回答