Как я могу использовать слабые прагмы с функциями пространства имен?

Это работает:

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

Решение

В 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».

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]