【问题标题】:How to instruct the compiler to generate an alias for a virtual function?如何指示编译器为虚函数生成别名?
【发布时间】:2012-02-20 18:49:42
【问题描述】:

背景见this question

基本上,我有以下类的定义

class  MyClass {
    virtual int foo4(double, int);
};

有没有办法指示编译器生成两个可以解析为foo4 的符号?也就是说,我希望如果可执行文件要求动态链接器解析_ZN7MyClass4foo4EdiMyClass::foo4(double, int) 的符号)和其他一些符号(比如说_ZN7MyClass9reserved1EvMyClass::reserved1() 的符号),动态链接器将解析都发给&MyClass::foo4(double, int)。我在 Linux 上使用相当现代的 GCC。

【问题讨论】:

标签: c++ linux linker virtual abi


【解决方案1】:

在 gcc 中,使用 "alias" attribute

int reserved1() __attribute__((alias ("_ZN7MyClass4foo4Edi")));

...但我相信这只会在与 (a) 符号定义相同的目标文件中工作,所以我不确定它是否适合您的用例:请参阅here。具体来说,它只会是一个版本的虚拟调用的别名,不会被子类继承;另外,你不能用它给弱符号起别名。

【讨论】:

    【解决方案2】:

    在 C++ 中它看起来像这样:

    class  MyClass {
        int foo5(double, int) __attribute__((alias("_ZN7MyClass4foo4Edi")));
        virtual int foo4(double, int);
    };
    
    int MyClass::foo4(double d, int i)
    {
    }
    

    【讨论】:

    • 请注意,这两个答案都有关于名称修改的假设,当 GCC 更改版本时可能会偶尔更改。
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2022-12-06
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多