2017-02-14 39 views
0

我是一个新的程序员,主要使用Code :: Blocks for C 。 我最近发现了关于typeof(),因为它被隐藏为__typeof __() ,我想知道是否可以保存类型作为typeof的结果。是这样的:如何保存typeof的结果?

type a = __typeof__(?); 

或者

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

这可能吗?

+8

有没有'标准C. typeof'操作你必须要阅读* *编译的文件(而不是代码::块IDE)了解更多信息。另外,*不要*做你想做的事情,在所有情况下99.99%不是你应该做的事情。也许如果你解释*为什么*你想这么做,那么*实际问题*是你想要解决的问题,那么我们可以帮你解决这个问题。 –

+0

如果'var'具有类型'int',那么'typeof(var)'是'int'。你可以说'输入= int;'或任何类似的东西?这意味着什么?你为什么需要这样的东西? –

+0

假设您想要在Java中编写'Class c =“foo”.getClass();'的方法:忘记它,它不像C那样工作。运行时没有可用的类型信息。 –

回答

2

您应该避免使用typeof__typeof __(),因为它们不是标准C.最新的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

不,你不能使用typeoft = (typeof(x) == int) ? a : b;也不int t = typeof(x);

如果你是C11下,_Generic可以帮助:

#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'。 –