분류 | 게시판 |
베스트 |
|
유머 |
|
이야기 |
|
이슈 |
|
생활 |
|
취미 |
|
학술 |
|
방송연예 |
|
방송프로그램 |
|
디지털 |
|
스포츠 |
|
야구팀 |
|
게임1 |
|
게임2 |
|
기타 |
|
운영 |
|
임시게시판 |
|
#define container_of(ptr, type, member) ((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
#define MACRO1(X) _Generic ((X), int: "int", double: "double")
int i = 99;
printf ("%s\n", MACRO1 (i));
#define MACRO2(X) _Generic ((X), int: printf ("int %d\n", (X)), double: printf ("double %lf\n", (X)))
int i = 99;
MACRO2 (i);
({ int a = 1; a; })
라는 문장식은 1 이란 값을 돌려줍니다. (비주얼 스튜디오 C 는 지원하지 않습니다.) MACRO1() 매크로를 다음과 같이 바꾸면 타입을 받도록 할 수 있습니다.#define MACRO3(T) _Generic (({ T X = 0; X; }), int: printf ("int\n"), double: printf ("double\n"))
MACRO3 (double);
#define MACRO4(X) _Generic (({ typeof(X) A = 0; A; }), int: printf ("int\n"), double: printf ("double\n"))
int i = 99;
MACRO4 (i);
MACRO4 (double);
#define MACRO5(X) ({ typeof(X) A = (X)+0; _Generic (A, int: printf ("int %d\n", A), double: printf ("double %lf\n", A)); })
double d = 99.9;
MACRO5 (int);
MACRO5 (d);
#define MACRO6(X) ({ __auto_type A = (X)+0; _Generic (A, int: printf ("int %d\n", A), double: printf ("double %lf\n", A)); })
int i = 99;
MACRO6 (i);
MACRO6 (double);
#define MACRO7(X) ({ __auto_type A = (X)+0; _Generic (A, char: printf ("char %hhi\n", A), int: printf ("int %d\n", A), double: printf ("double %lf\n", A)); })
char c = 0;
MACRO7 (c);
MACRO7 (char);
#define MACRO8(X) ({ __auto_type A = (typeof (X))((X)+0); _Generic (A, char: printf ("char %hhi\n", A), int: printf ("int %d\n", A), double: printf ("double %lf\n", A)); })
char c = 0;
MACRO8 (c);
MACRO8 (char);
#define MACRO9(X) __builtin_choose_expr (__builtin_constant_p ((X)+0), _Generic (({ __auto_type A = (typeof (X))((X)+0); A; }), char: printf ("char type\n"), int: printf ("int type\n"), double: printf ("double type\n")), ({ __auto_type A = (typeof (X))((X)+0); _Generic (A, char: printf ("char type value %hhi\n", A), int: printf ("int type value %d\n", A), double: printf ("double type value %lf\n", A)); }))
char c = 0;
MACRO9 (c);
MACRO9 (char);
int i = 99;
MACRO9 (i);
MACRO9 (99);
#define MACRO10(X) __builtin_choose_expr (__builtin_constant_p ((X)+0), (((X)+1 == (typeof (X))+1) ? _Generic (({ __auto_type A = (typeof (X))((X)+0); A; }), char: printf ("char type\n"), int: printf ("int type\n"), double: printf ("double type\n")) : ({ __auto_type A = (typeof (X))((X)+0); _Generic (A, char: printf ("char type value %hhi\n", A), int: printf ("int type value %d\n", A), double: printf ("double type value %lf\n", A)); })), ({ __auto_type A = (typeof (X))((X)+0); _Generic (A, char: printf ("char type value %hhi\n", A), int: printf ("int type value %d\n", A), double: printf ("double type value %lf\n", A)); }))
int i = 99;
MACRO10 (i);
MACRO10 (99);
__builtin_choose_expr (__builtin_constant_p ((X)+0), (((X)+1 == (typeof (X))+1) ? 타입인경우 : 상수인경우), 변수인경우)
__builtin_choose_expr (__builtin_constant_p ((X)+0), (((X)+1 == (typeof (X))+1) ? 타입인경우 : 상수인경우), ({ __auto_type A = ((typeof (X))((X)+0)); ((((void*)(A + 1)) != (((void*)A) + 1)) ? 일반변수인경우 : 포인터인경우); }))
죄송합니다. 댓글 작성은 회원만 가능합니다.