반응형
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
반응형
'programing' 카테고리의 다른 글
C의 파일 크기는 어떻게 결정합니까? (0) | 2022.06.12 |
---|---|
NuxtJs 스토어에서 localStorage에 액세스하려면 어떻게 해야 합니까? (0) | 2022.06.12 |
Vue 라우터 링크에서 밑줄을 제거할 수 없음 (0) | 2022.06.12 |
Vue: 렌더링된 이름 있는 슬롯 내의 Vue 컴포넌트 메서드에 액세스합니다. (0) | 2022.06.12 |
java.lang의 원인ArrayIndexOutOfBoundsException과 이를 방지하는 방법 (0) | 2022.06.12 |