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

时间:2013-01-21 16:46:34

标签: c++ gcc pragma

这有效:

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)为我发出错位的名字吗?

1 个答案:

答案 0 :(得分: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”规范。