2010-08-26 67 views
10

所以我有一个应用程序,编译良好的Windows,Linux和一些unix的变种。我最近决定将它移植到OSX上,当我遇到困难时。C++标准库中的所有函数都需要外部链接吗?

我有一个模板,看起来像这样:

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

如果您在严格标准模式下编译,您还将获得标准行为。 – 2010-08-27 21:08:07

回答

18

C++ 03§17.4.2.2/ 1说:

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

同在C真:C99§7.1.2/ 6说:

的库函数的任何声明,须具有外部连接。

+2

+1:我喜欢参考标准 – Chubsdad 2010-08-26 03:08:56

0

如何使用“cctype”(我的意思是在尖括号内)而不是“ctype.h”不管怎么说,这将是一个老式头我猜。

+0

我使用的是'',但是错误源于包括''的错误。 – 2010-08-26 03:22:21

+0

@Evan Teran:让我们所有人都知道你是如何解决这个问题的。 – Chubsdad 2010-08-26 03:32:36

+0

我已经向苹果提交了一个错误报告(https:// bugreport。apple.com/cgi-bin/WebObjects/RadarWeb.woa/9/wo/6aVZoNoJkJwq5qhwL0J7Bw/10.60)。与此同时,我只是简单地使用宏来直接调用函数,或者通过基于OSX上正在编译的模板来调用函数。不是一个理想的解决方案,但现在已经足够好了。 – 2010-08-26 03:44:16

3

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

如果你不告诉编译器你想要一致性,你不符合。几乎在所有平台上都是这样,尽管方式不同。

如果你想要所有扩展的细节,哪些不需要严格的一致性,你可以在包含标题前定义_DONT_USE_CTYPE_INLINE_,并且你将得到具有外部链接功能的非内联版本。

相关问题