【问题标题】:How to use weak function in C++如何在 C++ 中使用弱函数
【发布时间】:2020-04-17 08:03:26
【问题描述】:

我正在尝试在 C++ 的类中使用弱函数。以下是我写的:

#include <stdio.h>
#include <iostream>

class A {
    public:
    void func(int argc, char *argv[]) __attribute__((weak));
};

// optional definition:
#if 0
void A::func(int argc, char *argv[]) { 
    printf("In func()\n");
    for(int aa = 0; aa < argc; aa++){
        printf("arg %d = %s \n", aa, argv[aa]);
    }
}
#endif

int main(int argc, char *argv[]) {
    A a1;
    if (a1.func){ 
        a1.func(argc, argv); 
    } else {
        printf("func() not available\n");
    }
    return 0;
}

但这会产生以下编译错误:

main.cpp: In function ‘int main(int, char**)’:
main.cpp:21:16: error: cannot convert ‘A::func’ from type ‘void (A::)(int, char**)’ to type ‘bool’
     if (a1.func){
                ^

如果我将 func() 移到一个类之外并使用 gcc 而不是 g++,它可以正常编译并按预期工作。有人可以告诉什么问题。基本上,我只想在不使用 cpp 文件中的编译器标志的情况下调用某些类函数(可选功能)。

【问题讨论】:

  • @idclev463035818 是这样的,见stackoverflow.com/a/3749780/1968。也就是说,我没有看到任何迹象表明这应该适用于类成员函数,或者更普遍地适用于 C++ 调用约定(并且属性应该是 weak_import)。
  • @KonradRudolph 对不起,我的错。似乎我的研究导致我得出了错误的结论

标签: c++ attributes weak-symbol


【解决方案1】:

C++ 对此有一个标准机制。无需链接器技巧。

class Base {
 public:
    virtual void func(int argc, char *argv[]) 
    {
         printf("func() not available\n");
    }
};

class A : public Base {
    public:
#if 0
    void func(int argc, char *argv[]) override;
#endif
};

#if 0
void A::func(int argc, char *argv[]) { 
    printf("In func()\n");
    for(int aa = 0; aa < argc; aa++){
        printf("arg %d = %s \n", aa, argv[aa]);
    }
}
#endif

int main(int argc, char *argv[]) {
    A a1;
    a1.func(argc, argv); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多