1

这有效:

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)为我发出损坏的名称?

4

1 回答 1

2

在 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”规范。

于 2013-01-22T06:17:33.353 回答