2个结构之间的兼容性

时间:2011-09-05 20:39:03

标签: c

我希望我可以使用预处理器,但输入是在运行时...我尝试了条件typedef,不起作用。或条件声明,不起作用。虽然我并没有真正期待它们。由于后面的所有代码完全相同,我不想重写两次..每个结构一次。

有没有办法在C中执行此操作?或者采用不同的方法,结果相同。我所有的谷歌搜索都带我进入C ++模板。如果我不清楚,也许这会有所帮助:

#include <stdio.h>

struct a32 {
    short bits;
    unsigned long val;
    // more values, not necessarily in the same order
};

struct a64 {
    short bits;
    unsigned long long val;
    // etc...
};

int main(void) {
    struct a32 mystruct;

    // read mystruct from somewhere

    if(mystruct.bits == 64) {
        // then I need mystruct to be a64
        // re-read mystruct
    }

    // exact same code for both structs

    printf("%d\n", sizeof(mystruct.val));
    return 0;
}

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

为什么不做这样的事情,假设填充不是问题:

struct {
    unsigned long val;
} a32;

struct {
    unsigned long long val;
} a64;

int main(void) {
    short bits;
    union {
        struct a32 struct32;
        struct a64 struct64;
    };

    // Read bits

    if (bits == 64) {
        // Read into struct64
    } else {
        // Read into struct32
    }

    return 0;
}

当然,这将要求您了解bits的值,以便了解要访问的结构变量。

答案 1 :(得分:2)

您可以使用工会“排序”这样做:

struct{
    short bits;
    union{
        unsigned long a32;
        unsigned long long a64;
    };
} a_int;

int main(void) {
    a_int mystruct;

    // read mystruct from somewhere

    if(mystruct.bits == 64) {
        // then I need mystruct to be a64
        // re-read mystruct
    }

    // exact same code for both structs

    printf("%d\n", sizeof(mystruct.a32));
    return 0;
}

编辑: 但是,不能使printf()对32位和64位整数都起作用。

答案 2 :(得分:1)

不是100%确定这就是你的意思。如果没有,请澄清问题。

您应该使用标记的联合。使用标记(例如int)和union创建结构。联合在可能的结构之间,标签可以识别出哪一个结构。

Google“标记了联盟”了解更多详情。