可以将C数据类型存储在变量中吗?
这样的东西
void* type = (byte*);
这里是一个场景,我写了一个测试用例,并尝试使用某些数据类型在printf中打印一个字节数组,具体取决于给定的参数:
void print_byteArray(const void* expected,size_t size,bool asChars,bool asWCharT) { int iterations; char* format; if (asChars) { iterations = (size / (sizeof (char))); format = "%c"; } else if (asWCharT) { iterations = (size / (sizeof (wchar_t))); format = "%lc"; } else { iterations = (size / (sizeof (byte))); format = "%x"; } int i; for (i = 0; i < iterations; i++) { if (asChars) { printf(format,((char*) expected)[i]); } else if (asWCharT) { printf(format,((wchar_t*) expected)[i]); } else { printf(format,((byte*) expected)[i]); } } fflush(stdout); }
这看起来效率低下.我想象一下,可以将循环体的尺寸缩小到一行:
printf(format,((type) expected)[i]);
解决方法
不,没有这样的类型可以存储在标准C.
gcc提供了一种可能有用的扩展名.使用这个关键字的语法看起来像sizeof,但是构造方式就像一个用typedef定义的类型名称.详见here.
一些使用typeof的例子:
这表示y与x指向的类型.
typeof (*x) y;
这将y声明为这样的值的数组.
typeof (*x) y[4];
这将y声明为指向字符的指针数组:
typeof (typeof (char *)[4]) y;
它相当于以下传统的C声明:
char *y[4];
要使用typeof来查看声明的含义,为什么它可能是一个有用的方式来写,用这些宏重写:
#define pointer(T) typeof(T *) #define array(T,N) typeof(T [N])
现在声明可以这样重写:
array (pointer (char),4) y;
因此,array(pointer(char),4)是指向char的4个指针的数组类型.