这个有效:
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++ 中没有稳定的 demangle 方法,原因是 mangling 规则即使在不同的 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”规范更适合您。
关于c++ - 如何将 pragma weak 与命名空间函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14443336/