这有效:
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)为我发出错位的名字吗?
答案 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”规范。