일부 코드가 C와 C에서 컴파일하려면 ++ 나는이 몇 곳에서 사용C11의 _Generic을 사용하여 GNU C의 typeof (x)를 구현할 수 있습니까?
이#ifdef __cplusplus
#define typeof(x) decltype(x) // works ok in most cases, except C++ reference types
#endif
char* a = (typeof(a)) malloc(4);
C, 이것은 캐스트는 전적으로 불필요한입니다 char* a = (char *) malloc(4)
에 컴파일하지만 void *
C++로 암시 적으로 char *
으로 승격되지 형변환이 존재하지 않으면 에러가 발생합니다.
GCC 나 Clang에서 -std=gnu11
으로 컴파일 할 때도 마찬가지지만 ISO C11로 컴파일 할 때 어떻게해야합니까?
typeof.h: In function ‘main’:
typeof.h:2:24: error: expected expression before ‘,’ token
short: (short), \
^
typeof.h:8:13: note: in expansion of macro ‘gettype’
char a = (gettype(a)) 1;
^~~~~~~
typeof.h:8:25: error: expected ‘,’ or ‘;’ before numeric constant
char a = (gettype(a)) 1;
gcc -E
gettype(x)
에 정의 된 유형
a
의 선언에 주어진다
#define gettype(x) _Generic((x), \
short: (short), \
char: (char ), \
char*: (char *), \
default: (void *) )
int main (void) {
short a = (gettype(a)) 1;
return a;
}
그러나 : 나는 어떤 종류의 캐스팅 typeof(x)
을 구현하기 위해 C11의 _Generic
를 사용할 수 있다고 생각 그냥 괜찮습니다 :
short a = (_Generic((a), short: (short), char: (char), char*: (char *), default: (void *))) 1; ^
일부 구문이 누락되었거나 C에서 단순히 _Generic
을 사용하여 캐스트 코드를 생성 할 수 없습니까?
'_Generic'은 매크로 밖에서 거의 사용할 수 없지만 전 처리기의 일부가 될 수 없습니다. 따라서 텍스트 대체를 제공 할 수 없습니다. – Olaf
C 및 C++ 호환성이없는 것보다 완전한 C 호환성 및 C++ 호환성을 제공하는 것이 좋습니다. – user694733
@ user694733 비평 해 주셔서 고맙습니다.하지만이 코드는 GCC 또는 Clang을 사용하여 C로만 컴파일 될 것입니다. C++ compat은 C90을 간신히 지원하는 MSVC 용입니다. – cat