是否可以在变量中存储C数据类型?

时间:2013-07-15 00:37:11

标签: c types

是否可以将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);
}

这看起来效率低下。我想象一下,可以将for-loop体的大小缩小到一行:

printf(format, ((type) expected)[i]);

2 个答案:

答案 0 :(得分:13)

不,没有可以在标准C中存储类型的类型。

gcc提供可能有用的typeof扩展名。使用此关键字的语法类似于sizeof,但该构造在语义上的行为类似于使用typedef定义的类型名称。有关详细信息,请参阅here

使用typeof的更多示例:

使用x指向的类型声明y。

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个指针的数组类型。

答案 1 :(得分:0)

C是一种静态类型语言,因此您必须构建自己的运行时类型系统。但是,如果只想打印任意数据的值,可以使用printf的{​​{1}}并使用临时字符串缓冲区。这将适用于您要打印的数据受限的某些情况:

%s