Tôi muốn sử dụng các từ khóa C11_Generic
để điền vào một đoàn theo kiểu tĩnh, như:_Generic để điền vào một số công đoàn
typedef union {
double d;
long l;
const char*s;
void*p;
} ty;
#define make_ty(X) _Generic((X), \
double: (ty){.d=(X)}, \
long: (ty){.l=(X)}, \
const char*: (ty){.s=(X)}, \
default: (ty){.p=(X)})
ty from_double(double x) { return make_ty(x); }
ty from_string(const char*s) { return make_ty(s); }
ty from_long(long l) { return make_ty(l);}
nhưng điều này không biên dịch, ví dụ GCC 5.3 cung cấp cho (với gcc -std=c11 -Wall
):
u.c: In function ‘from_double’:
u.c:11:35: error: incompatible types when initializing type ‘const char *’
using type ‘double’
const char*: (ty){.s=(X)}, \
^
u.c:14:41: note: in expansion of macro ‘make_ty’
ty from_double(double x) { return make_ty(x); }
BTW, sử dụng gcc -std=c99 -Wall
cho cùng một lỗi ...
Hoặc là _Generic
chỉ hữu ích cho tgmath.h
?
Tôi nghĩ rằng _Generic
chọn biểu theo kiểu biên dịch tiếng, vì vậy không sensical (ty){.s=(x)}
sẽ được bỏ qua trong from_double
....
(nếu điều đó đã làm việc, tôi sẽ có thể "quá tải" make_ty
theo tĩnh, trình biên dịch đã biết, loại đối số ...)
Ok, nhưng ngay cả trong '-std = c11' điều này không hoạt động –
[Câu hỏi này] (http://stackoverflow.com/questions/24743520/incompatible-pointer-types-passing-in-generic-macro) có một vấn đề tương tự và câu trả lời hàng đầu có thể trả lời câu hỏi của bạn –
Các câu trả lời khác trên cùng một chủ đề dường như gợi ý rằng các trường hợp khác không được phép chứa * vi phạm ràng buộc * (loại sai cho trình khởi tạo thực sự là một trong số đó) –