使用包含union和类型成员的结构

use*_*842 1 c printf libvirt

我正在尝试调试我正在编写的程序,它正在使用C中的libvirt库.

在程序的一部分我将返回以下结构:

struct virTypedParameter {
    char field[VIR_TYPED_PARAM_FIELD_LENGTH];
    int type;
    union {
        int i;
        unsigned int ui;
        long long int l;
        unsigned long long int ul;
        double d;
        char b;
        char *s;
    } value;
}
Run Code Online (Sandbox Code Playgroud)

所以我有一个键,值和值类型.我希望能够通过将它们传递给函数来打印它们.

除了将类型抛入switch语句并重定向到正确的printf语句之外,还有更简单的方法吗?我已经这样做了,它导致在编译时弹出大量警告:

void printVirTypedParameter(virTypedParameter* param) {
    printf("Param type: %d\n", param->type);
    switch(param->type) {
        case 1: //int
            printf("%s : %d\n", param->field, param->value);
            break;
        case 2: //int unsigned
            printf("%s : %u\n", param->field, param->value);
            break;
        case 3: //long long int
            printf("%s : %ld\n", param->field, param->value);
            break;
        case 4: //long long unsinged
            printf("%s : %llu\n", param->field, param->value);
            break;
        case 5: //double
            printf("%s : %f", param->field, param->value);
            break;
        case 6: //boolean (character)
            printf("%s : %c", param->field, param->value);
            break;
        case 7: //string
            printf("%s : %s", param->field, param->value);
            break;
        case 8: //param last
            printf("END_PARAMS");
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*ter 5

切换是这样做的方式.但是你应该使用适合你所读类型的union的成员,即param->value.i如果你知道类型是你应该使用的int.这应该避免任何警告.

例如:

switch(param->type) {
        case 1: //int
            printf("%s : %d\n", param->field, param->value.i);
            break;
        // ...
}
Run Code Online (Sandbox Code Playgroud)