代码之家  ›  专栏  ›  技术社区  ›  Evan Teran

C++标准库中的所有函数都需要外部链接吗?

  •  10
  • Evan Teran  · 技术社区  · 14 年前

    所以我有一个应用程序可以在Windows、Linux和一些不同的Unix上很好地编译。我最近决定把它移植到OSX,当时我遇到了一个障碍。

    我有一个模板,如下所示:

    template<int (&F)(int)>
    int safe_ctype(unsigned char c) { return F(c); }
    

    其思想是在上面给出输入值时,防止符号扩展破坏某些实现。 0x7f . 它通常是这样使用的:

    safe_ctype<std::isspace>(ch);
    

    不幸的是,这在OSX上不起作用(使用GCC4.2)。这个错误与 std::isspace 没有外部链接,因此不适用于模板。结果在OSX上, ctype.h 标题已标记所有函数(通过宏) static inline .

    我的问题是:

    C++中的函数(在这种情况下继承了C的部分)标准库是否没有外部链接,是否允许任何相关的标准?

    编辑:

    我已经收到苹果的回信了。显然,他们有一个宏来控制这种行为。定义 _DONT_USE_CTYPE_INLINE_ 防止ctype函数是静态内联的。

    3 回复  |  直到 14 年前
        1
  •  18
  •   James McNellis    14 年前

    C++ 03×7.4.4.2.2/1表示:

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

    在C:C99_7.1.2/6中也是如此,它说:

    图书馆职能的任何声明都应具有外部联系。

        2
  •  3
  •   Stephen Canon    14 年前

    操作系统X <ctype.h> 头文件通过检查是否在标准模式下编译来保护非标准的内联版本。

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

    如果您想要扩展的所有细节和不需要的细节,因此不想要求严格的一致性,那么您可以定义 _DONT_USE_CTYPE_INLINE_ 在包含头部之前,您将获得具有外部链接的函数的非内联版本。

        3
  •  0
  •   Chubsdad    14 年前

    用“cctype”(我的意思是在尖括号内)而不是“ctype.h”怎么样?我想这是一个老式的styed头。