gpt4 book ai didi

C++ 将共享库中的导出定义用作内联

转载 作者:行者123 更新时间:2023-11-28 01:22:13 26 4
gpt4 key购买 nike

我想知道是否有一种简单的方法可以在共享库中使用定义作为内联,但仍然导出符号以供其他应用程序导入。

最佳答案

根据标准的规定,这是不可能的。

[dcl.inline]
6. An inline function or variable shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case [...] If a function or variable with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required.

所以同一个函数不能在程序的一部分内联而在另一部分非内联。您必须使用包装器。

gcc 有一种方法可以导出 inline 函数。试试 -fkeep-inline-functions__attribute__((used))。目前尚不清楚这在 C++ 上下文中有多大用处,因为根据规则,您必须导出内联函数定义以供所有人查看,然后它们将由共享库的客户端内联。 Clang 仅支持 __attribute__((used))

如果您愿意按照标准输掉比赛,您可以尝试忽略两个引用的句子中的任何一个并希望最好的结果。我已经用 gcc 尝试了这两种方法,它们似乎都有效,但是它们都会导致未定义的行为,所以不能保证。

  1. 内联函数或变量应在每个使用 odr 的翻译单元中定义——忽略它。只是在不编译库时不要定义它。用 __attribute__((used)) 标记它,以便发出符号。

    class X {
    inline void foo();
    };

    #ifdef BUILDING_SHARED_LIB
    void __attribute__((used)) X::foo() {}
    #endif
  2. 它应该在它出现的所有翻译单元中被声明为内联——忽略它。当您不编译库时,不要将它声明为 inline(当然也不要定义它)。用 __attribute__((used)) 标记它,以便发出符号。

    class X {
    void foo();
    };

    #ifdef BUILDING_SHARED_LIB
    inline void __attribute__((used)) X::foo() {}
    #endif

这两种方法似乎都适用于我,但正如我所说,不能提供任何保证,因为根据标准这是 UB。然而,Itanium ABI 并不关心函数是否声明为内联,因此可以认为 ABI 为情况 2 提供了保证。我不能保证这一点。

关于C++ 将共享库中的导出定义用作内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55592684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com