programing

C11에서의 _Generic 구문 및 사용 예

prostudy 2022. 6. 12. 11:56
반응형

C11에서의 _Generic 구문 및 사용 예

C11에 제네릭스가 추가됐다고 들었어요.검색도 좀 하고 기사도 좀 보고 새로운 키워드가 있다는 걸 알았어요._Generic등입니다.하지만 다 이해할 수 없을 것 같아요.

C#의 제네릭이나 C++의 템플릿 같은 건가요?제네릭스의 C11 정의, 구문 및 간단한 샘플 사용 예제에 대해 누가 간략하게 설명해 주시겠습니까?

가 본 가장 좋은 예는 다음과 같은 (실행 가능한) 예에 영감을 주었다.그것은 자기성찰의 온갖 기괴한 가능성을 열어준다.

#include <stdio.h>
#include <stddef.h>
#include <stdint.h>

#define typename(x) _Generic((x),        /* Get the name of a type */             \
                                                                                  \
        _Bool: "_Bool",                  unsigned char: "unsigned char",          \
         char: "char",                     signed char: "signed char",            \
    short int: "short int",         unsigned short int: "unsigned short int",     \
          int: "int",                     unsigned int: "unsigned int",           \
     long int: "long int",           unsigned long int: "unsigned long int",      \
long long int: "long long int", unsigned long long int: "unsigned long long int", \
        float: "float",                         double: "double",                 \
  long double: "long double",                   char *: "pointer to char",        \
       void *: "pointer to void",                int *: "pointer to int",         \
      default: "other")

#define fmt "%20s is '%s'\n"
int main() {

  size_t s; ptrdiff_t p; intmax_t i; int ai[3] = {0}; return printf( fmt fmt fmt fmt fmt fmt fmt fmt,

     "size_t", typename(s),               "ptrdiff_t", typename(p),     
   "intmax_t", typename(i),      "character constant", typename('0'),
 "0x7FFFFFFF", typename(0x7FFFFFFF),     "0xFFFFFFFF", typename(0xFFFFFFFF),
"0x7FFFFFFFU", typename(0x7FFFFFFFU),  "array of int", typename(ai));
}
                 ╔═══════════════╗ 
═════════════════╣ Amazeballs... ╠═════════════════════════════════════
                 ╚═══════════════╝ 
            size_t is 'unsigned long int'
         ptrdiff_t is 'long int'
          intmax_t is 'long int'
character constant is 'int'
        0x7FFFFFFF is 'int'
        0xFFFFFFFF is 'unsigned int'
       0x7FFFFFFFU is 'unsigned int'
      array of int is 'other'

이것은 꽤 좋은 소개입니다.개요는 다음과 같습니다.

범용 선택은 새로운 키워드 _Generic을 사용하여 구현됩니다.구문은 타입의 단순한 스위치문과 비슷합니다._Generic( 'a', char: 1, int: 2, long: 3, default: 0)는 2로 평가됩니다(문자 상수는 C의 ints).

기본적으로는 이 기능은switch여기서 라벨은 첫 번째 표현의 유형과 대조하여 테스트되는 유형 이름입니다.'a'위)를 참조해 주세요.그 결과는 다음 평가의 결과가 됩니다._Generic().

clion 1.2.4를 사용하고 있으며 clion은 현재 c11을 지원하지 않기 때문에 _Generic 대신 c99에서 다음 코드를 사용합니다.

#include <stdio.h>

int main(int argc, char **argv) {
    char *s;
    if (__builtin_types_compatible_p(__typeof__(s), long)) {
        puts("long");
    } else if (__builtin_types_compatible_p(__typeof__(s), char*)) {
        puts("str");
    }
    return (0);
};

언급URL : https://stackoverflow.com/questions/9804371/syntax-and-sample-usage-of-generic-in-c11

반응형