Это работает:
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».
Других решений пока нет …