2017-02-14 15 views
0

저는 주로 Code :: Blocks for C 을 사용하는 새로운 프로그래머입니다. 저는 typeof()에 대해 알아 냈습니다. 왜냐하면 그것이 __typeof __() 으로 숨겨졌고 typeof의 결과로 유형을 저장할 수 있는지 알고 싶었습니다. 같은 :typeof의 결과를 저장하는 방법은 무엇입니까?

type a = __typeof__(?); 

또는

#define typeof __typeof__ 
type a = typeof(?); 

이 가능합니까?

+8

(안 코드 :: 블록 IDE) 더 많은 정보를 찾으십시오. 또한, 당신이하고 싶은 일을하지 마십시오. 99.99 %의 모든 경우에 당신이해야 할 일이 아닙니다. 당신이 * 왜 * 당신이 그것을하고 싶은지, * 실제 문제 *가 당신이 풀고 싶은 것이 무엇인지를 설명한다면 아마도 우리는 대신 당신을 도울 수 있습니다. –

+0

'var'의 타입이'int' 인 경우'typeof (var)'는'int'입니다. 'type a = int; '또는 비슷한 것을 말할 수 있습니까? 그것은 무엇을 의미할까요? 왜 그렇게 필요한거야? –

+0

자바에서'Class c = "foo".getClass();를 작성하는 것과 비슷한 것을하고 싶다고 생각하면 잊어 버리십시오. C 에서처럼 작동하지 않습니다. 런타임 중에는 사용할 수있는 유형 정보가 없습니다. –

답변

2

표준 C가 아니기 때문에 typeof 또는 __typeof __()을 피해야합니다. 최신 C 버전 (C11)은 동일한 방식으로 작동하는 _Generic 키워드를 통해이를 지원합니다.

는 C에는 "유형 유형"없습니다하지만 당신은 쉽게 하나를 직접 만들 수 있습니다

typedef enum 
{ 
    TYPE_INT, 
    TYPE_FLOAT, 
    TYPE_CHAR 
} type_t; 

#define get_typeof(x) \ 
    _Generic((x),   \ 
    int: TYPE_INT, \ 
    float: TYPE_FLOAT, \ 
    char: TYPE_CHAR); 

... 

float f; 
type_t type = get_typeof(f); 
1

아니, 당신은 t = (typeof(x) == int) ? a : b;int t = typeof(x); 같은 typeof을 사용할 수 없습니다.

당신이 C11 미만인 경우, _Generic이 도움이 될 수 있습니다

당신은 * 컴파일러 *에 대한 설명서를 읽을 필요 표준 C.에는`typeof` 운영자가 없습니다
#include <stdio.h> 

enum {TYPE_UNKNOWN, TYPE_INT, TYPE_CHAR, TYPE_DOUBLE}; 

#define type_of(T) _Generic((T), int: TYPE_INT, char: TYPE_CHAR, double: TYPE_DOUBLE, default: 0) 

int main(void) 
{ 
    double a = 5.; 
    int t = type_of(a); 

    switch (t) { 
     case TYPE_INT: 
      puts("a is int"); 
      break; 
     case TYPE_CHAR: 
      puts("a is char"); 
      break; 
     case TYPE_DOUBLE: 
      puts("a is double"); 
      break; 
     default: 
      puts("a is unknown"); 
      break; 
    } 
    return 0; 
} 
+1

감사합니다! 내 컴파일러를 c11으로 변경하고 'Generic'을 사용했습니다. –