如何在命名空间函数中使用pragma weak

How can I use pragma weak with namespaced functions?

本文关键字:pragma weak 函数 命名空间      更新时间:2023-10-16

这行得通:

test1.h

namespace funcs {
  extern "C" {
    void a();
    void b();
    void c();
  }
}

test1.cpp

namespace funcs {
  void (*all[])() = {a, b, c};
}
extern "C" void hang() {
  while (true);
}
#pragma weak a = hang
#pragma weak b = hang
#pragma weak c = hang

但这不是:

test1.h

namespace funcs {
    void a();
    void b();
    void c();
}

test1.cpp

namespace funcs {
  void (*all[])() = {a, b, c};
}
void hang() {
  while (true);
}
#pragma weak funcs::a = hang
#pragma weak funcs::b = hang
#pragma weak funcs::c = hang

我认为这是由于#pragma weak要求混乱的名称。是否有任何方法可以让编译器(GCC 4.7.3)为我发出混乱的名称?

在g++中没有稳定的修改方式,原因是修改规则即使在不同的g++版本之间也是不可移植的。

另外,#pragma weak是C扩展(在gcc/c-family/c-pragma.c文件中声明),通常不与c++一起工作

就GCC开发而言,正确的解决方案是提供#pragma cpp-weak之类的代码并提交给GCC,但这似乎是相当复杂的任务。你可以在GCC bugzilla中提出改进请求,也许有人会帮助你。

您可能还想自己为c++函数声明汇编器标签,并为它们创建弱引用,如:

namespace funcs {
    void a()  __asm__("mya");
    void b()  __asm__("myb");
    void c()  __asm__("myc");
}
namespace funcs {
  void (*all[])() = {a, b, c};
}
extern void hang() __asm__("myhang");
void hang() {
  while (true);
}
#pragma weak mya = myhang
#pragma weak myb = myhang
#pragma weak myc = myhang

但是我不确定,它是否比"extern C"规范更适合你。