Tôi cố gắng để tạo ra các chức năng quá tải sử dụng vĩ mô _Generic tại C11, và tôi đã dừng lại trên không đối số hỗ trợ chức năng, ví dụ:Thêm zero đối số chức năng để _Generic vĩ mô
#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;
}
Còn bây giờ biên dịch và chạy:
printf("%s",msg("hello!"));
đi mà không có vấn đề gì, nhưng:
printf("%s",msg());
ném lỗi:
main.c:7:17: error: expected expression
printf("%s",msg());
Tôi đang sử dụng:
clang --version
clang version 3.5.0 (tags/RELEASE_350/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
GCC ném:
main.c:7:5: warning: implicit declaration of function ‘_Generic’
vì vậy tôi hiểu _Generic không được hỗ trợ phiên bản này của gcc:
gcc --version
gcc (Gentoo 4.8.3 p1.1, pie-0.5.9) 4.8.3
là vấn đề của tôi thậm chí có thể giải quyết được hoặc tôi chỉ đánh giá cao khả năng của _Generic, hoặc tôi chỉ cần nâng cấp trình biên dịch của tôi để sử dụng tùy chọn này đúng cách?
1) '" hello! "' Có thể khớp 'char [7]' 2) 'msg_none (_1)' nhưng 'msg_none (void)' 3) 'char * result = malloc (msglen + 3) ; ':' + 3' phải là '+ 4' cho NUL. – BLUEPIXY
'_Generic' GCC 4.9 [C11Status] (https://gcc.gnu.org/wiki/C11Status) – BLUEPIXY
@BLUEPIXY, hôm nay họ đã chuyển gcc 5.1, trong đó có C11 (+ gnu extensions) làm mặc định. –