我希望我可以使用预处理器,但输入是在运行时...我尝试了条件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;
}
任何帮助都将不胜感激。
答案 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“标记了联盟”了解更多详情。