Próbuję wygenerować funkcje przeciążone użyciu _Generic makro w C11, i przestali na zerowe argumenty przemawiają funkcji, np:Dodaj zerowy argumenty funkcjonować do _Generic makro
#define msg(_1) _Generic((_1), char*: msg_string, default: msg_none)(_1)
char* msg_none(void){
return moo_string("Have a nice day!");
}
char* msg_string(char* message){
int msglen = strlen(message);
char* result = malloc(msglen + 3);
sprintf(result, "<%s>\n", message);
return result;
}
Teraz kompilacja i uruchamianie:
printf("%s",msg("hello!"));
idzie bez problemu, ale:
printf("%s",msg());
wyrzuca błąd:
main.c:7:17: error: expected expression
printf("%s",msg());
Używam:
clang --version
clang version 3.5.0 (tags/RELEASE_350/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
GCC rzuca:
main.c:7:5: warning: implicit declaration of function ‘_Generic’
więc rozumiem _Generic nie obsługuje tej wersji gcc:
gcc --version
gcc (Gentoo 4.8.3 p1.1, pie-0.5.9) 4.8.3
jest mój problem nawet rozwiązywalne lub po prostu przeceniam możliwości _Generic, czy po prostu muszę uaktualnić moje kompilatory, aby poprawnie używać tych opcji?
1) ' "Witam"' może dopasować char [7] '2)' msg_none (_1) 'ale' msg_none (void) '3) char * wynik = malloc (msglen + 3) ; ':' + 3' powinno być '+ 4' dla NUL. – BLUEPIXY
'_Generic' GCC 4.9 [C11Status] (https://gc.gnu.org/wiki/C11Status) – BLUEPIXY
@BLUEPIXY, dzisiaj wysłano gcc 5.1, który ma C11 (+ rozszerzenia gnu) jako domyślny. –