C 两个结构之间的兼容性

C 两个结构之间的兼容性,c,C,我希望我可以只使用预处理器,但输入是在运行时进行的。。我尝试使用条件typedef,但不起作用。或条件声明,不起作用。虽然我真的没想到他们也会。既然下面的代码都是一样的,我不想重写两次。。每个结构一次 在C语言中有这样做的方法吗?或者不同的方法,有相同的结果。我所有的谷歌搜索都把我带到C++模板中。如果我不清楚,也许这会有帮助: #include <stdio.h> struct a32 { short bits; unsigned long val; //

我希望我可以只使用预处理器,但输入是在运行时进行的。。我尝试使用条件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;
}
#包括
结构a32{
短比特;
无符号长val;
//更多值,不一定按相同顺序排列
};
结构a64{
短比特;
无符号长val;
//等等。。。
};
内部主(空){
结构a32 mystruct;
//从某处读我的短信
if(mystruct.bits==64){
//那么我需要我的结构是a64
//重读我的结构
}
//两个结构的代码完全相同
printf(“%d\n”,sizeof(mystruct.val));
返回0;
}

如果有任何帮助,我们将不胜感激。

假设填充不会成为问题,为什么不这样做呢:

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;
}
当然,这需要您知道
位的值,以便知道要访问哪个结构变量。

您可以使用联合“排序”执行此操作:

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位整数。

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

您应该使用标记的联合。创建一个带有标记(例如int)和并集的结构。联合是可能的结构之间的联合,标记标识它是哪个结构


Google“tagged union”了解更多详细信息。

这也是我的解决方案:)我认为填充不应该有问题,因为union至少与其中声明的最大类型一样大,对吗?读取完整结构是个坏主意。您需要先读取“位”,然后对值进行“切换”,以填充其余数据。