Próbuję rozwiązać problem w bibliotece innej firmy. Problem polega na tym, że biblioteka używa zagnieżdżonych funkcji GCC ukrytych w makrze, a Clang nie obsługuje funkcji zagnieżdżonych i nie ma takich planów (por., Clang Bug 6378 - error: illegal storage class on function).Przepisz makro GCC z zagnieżdżoną funkcją Clang?
Oto makro to punkt ból dla mnie i Clang:
#define RAII_VAR(vartype, varname, initval, dtor) \
/* Prototype needed due to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36774 */ \
auto void _dtor_ ## varname (vartype * v); \
void _dtor_ ## varname (vartype * v) { dtor(*v); } \
vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
A oto jak jego używane (z komentarzy w kodzie):
* void do_stuff(const char *name)
* {
* RAII_VAR(struct mything *, thing, find_mything(name), ao2_cleanup);
* if (!thing) {
* return;
* }
* if (error) {
* return;
* }
* do_stuff_with_thing(thing);
* }
The Clang User Manua l stany używać C++ i funkcja lambda do emulacji. Nie jestem pewien, czy jest to najlepsza strategia, a projekt C prawdopodobnie będzie miał , a nie akceptować łatkę w C++ (prawdopodobnie najpierw wyskoczą i upuści mnie).
Czy istnieje sposób na przepisanie makra, aby był on (1) bardziej dostosowany do Clanga i (2) zachowuje pierwotną funkcję semantyczną?
Kolejnym sprawcą jest GLIBC. Zobacz [Dlaczego dostaję: "# error" glibc nie może być skompilowany bez optymalizacji "", kiedy próbujesz skompilować GNU libc z GNU CC?] (Http://sourceware.org/glibc/wiki/FAQ#Why_do_I_get:.60.23 error_.22glibc_cannot_be_compiled_without_optimization.22.27.2C_when_trying_to_compile_GNU_libc_with_GNU_CC.3F) – jww
Nawiasem mówiąc, to Asterisk: http://svn.asterisk.org/svn/asterisk/trunk/include/asterisk/utils.h Jeśli zdobyć szczęk do kompilacji Makro RAII_VAR, popychając ten wkład w górę strumienia byłoby niezwykle docenione. Jest kilka otwartych problemów. –
O ile, oczywiście, jeden z Was nie wniósł poprawki do tego problemu: https://issues.asterisk.org/jira/browse/ASTERISK-20850 :-) –