如果满足特定条件,则定义一个结构
define a struct if a certain condition is met
如果我使用的机器是 Little endian,我想以某种方式 typedef
一个结构,如果它是 Big,我想以其他方式 endian.I 试过:
unsigned int i = 1;
char *c = (char*)&i;
if (*c)
{
/*Little endian"*/
typedef struct
{
unsigned long A : A_BIT_SIZE;
unsigned long R : R_BIT_SIZE;
unsigned long E : E_BIT_SIZE;
unsigned long funct : FUNCT_BIT_SIZE;
unsigned long opsource : OPSOURCE_BIT_SIZE;
unsigned long sourcetype : SOURCETYPE_BIT_SIZE;
unsigned long opdest : OPDEST_BIT_SIZE;
unsigned long desttype : DESTTYPE_BIT_SIZE;
unsigned long opcode : OPCODE_BIT_SIZE;
}command_byte;
}
else
{
/*Big endian"*/
typedef struct
{
unsigned long opcode : OPCODE_BIT_SIZE;
unsigned long desttype : DESTTYPE_BIT_SIZE;
unsigned long opdest : OPDEST_BIT_SIZE;
unsigned long sourcetype : SOURCETYPE_BIT_SIZE;
unsigned long opsource : OPSOURCE_BIT_SIZE;
unsigned long funct : FUNCT_BIT_SIZE;
unsigned long E : E_BIT_SIZE;
unsigned long R : R_BIT_SIZE;
unsigned long A : A_BIT_SIZE;
}command_byte;
}
它可以编译,但我不确定这是否是在 if 语句中定义结构的有效方法。我也不确定当我实际使用该结构时它是否会起作用。也会处理头文件吗?如果满足条件,定义结构的正确方法是什么?
是的,您可以像那样使用 if
。但是 typedef command_type
只能在定义它的最里面的包含块中使用。
因此,定义 typedef ... command_type_big_endian
和 typedef ... command_type_little_endian
没有任何优势,您不能以任何方式共享代码。
您可以使用预处理器 宏 来帮助避免重复;那么你可以只编写一次 serialization 和 deserialization 宏,并为每个 command_type
变体实例化它。
您可以同时定义它们,并将它们放在一个联合中:
#include <stdio.h>
#define A_BIT_SIZE 3
#define R_BIT_SIZE 3
#define E_BIT_SIZE 2
#define FUNCT_BIT_SIZE 8
#define OPSOURCE_BIT_SIZE 2
#define SOURCETYPE_BIT_SIZE 2
#define OPDEST_BIT_SIZE 2
#define DESTTYPE_BIT_SIZE 2
#define OPCODE_BIT_SIZE 8
typedef union {
struct { /*Little endian"*/
unsigned A : A_BIT_SIZE;
unsigned R : R_BIT_SIZE;
unsigned E : E_BIT_SIZE;
unsigned funct : FUNCT_BIT_SIZE;
unsigned opsource : OPSOURCE_BIT_SIZE;
unsigned sourcetype : SOURCETYPE_BIT_SIZE;
unsigned opdest : OPDEST_BIT_SIZE;
unsigned desttype : DESTTYPE_BIT_SIZE;
unsigned opcode : OPCODE_BIT_SIZE;
} le;
struct { /*Big endian"*/
unsigned opcode : OPCODE_BIT_SIZE;
unsigned desttype : DESTTYPE_BIT_SIZE;
unsigned opdest : OPDEST_BIT_SIZE;
unsigned sourcetype : SOURCETYPE_BIT_SIZE;
unsigned opsource : OPSOURCE_BIT_SIZE;
unsigned funct : FUNCT_BIT_SIZE;
unsigned E : E_BIT_SIZE;
unsigned R : R_BIT_SIZE;
unsigned A : A_BIT_SIZE;
} be;
} command_byte;
int main(void)
{
command_byte stuff={{0,}};
stuff.le.opcode = 0x7f;
printf("Le = %x\n", (unsigned) stuff.le.opcode);
printf("Be = %x\n", (unsigned) stuff.be.opcode);
return 0;
}
如果我使用的机器是 Little endian,我想以某种方式 typedef
一个结构,如果它是 Big,我想以其他方式 endian.I 试过:
unsigned int i = 1;
char *c = (char*)&i;
if (*c)
{
/*Little endian"*/
typedef struct
{
unsigned long A : A_BIT_SIZE;
unsigned long R : R_BIT_SIZE;
unsigned long E : E_BIT_SIZE;
unsigned long funct : FUNCT_BIT_SIZE;
unsigned long opsource : OPSOURCE_BIT_SIZE;
unsigned long sourcetype : SOURCETYPE_BIT_SIZE;
unsigned long opdest : OPDEST_BIT_SIZE;
unsigned long desttype : DESTTYPE_BIT_SIZE;
unsigned long opcode : OPCODE_BIT_SIZE;
}command_byte;
}
else
{
/*Big endian"*/
typedef struct
{
unsigned long opcode : OPCODE_BIT_SIZE;
unsigned long desttype : DESTTYPE_BIT_SIZE;
unsigned long opdest : OPDEST_BIT_SIZE;
unsigned long sourcetype : SOURCETYPE_BIT_SIZE;
unsigned long opsource : OPSOURCE_BIT_SIZE;
unsigned long funct : FUNCT_BIT_SIZE;
unsigned long E : E_BIT_SIZE;
unsigned long R : R_BIT_SIZE;
unsigned long A : A_BIT_SIZE;
}command_byte;
}
它可以编译,但我不确定这是否是在 if 语句中定义结构的有效方法。我也不确定当我实际使用该结构时它是否会起作用。也会处理头文件吗?如果满足条件,定义结构的正确方法是什么?
是的,您可以像那样使用 if
。但是 typedef command_type
只能在定义它的最里面的包含块中使用。
因此,定义 typedef ... command_type_big_endian
和 typedef ... command_type_little_endian
没有任何优势,您不能以任何方式共享代码。
您可以使用预处理器 宏 来帮助避免重复;那么你可以只编写一次 serialization 和 deserialization 宏,并为每个 command_type
变体实例化它。
您可以同时定义它们,并将它们放在一个联合中:
#include <stdio.h>
#define A_BIT_SIZE 3
#define R_BIT_SIZE 3
#define E_BIT_SIZE 2
#define FUNCT_BIT_SIZE 8
#define OPSOURCE_BIT_SIZE 2
#define SOURCETYPE_BIT_SIZE 2
#define OPDEST_BIT_SIZE 2
#define DESTTYPE_BIT_SIZE 2
#define OPCODE_BIT_SIZE 8
typedef union {
struct { /*Little endian"*/
unsigned A : A_BIT_SIZE;
unsigned R : R_BIT_SIZE;
unsigned E : E_BIT_SIZE;
unsigned funct : FUNCT_BIT_SIZE;
unsigned opsource : OPSOURCE_BIT_SIZE;
unsigned sourcetype : SOURCETYPE_BIT_SIZE;
unsigned opdest : OPDEST_BIT_SIZE;
unsigned desttype : DESTTYPE_BIT_SIZE;
unsigned opcode : OPCODE_BIT_SIZE;
} le;
struct { /*Big endian"*/
unsigned opcode : OPCODE_BIT_SIZE;
unsigned desttype : DESTTYPE_BIT_SIZE;
unsigned opdest : OPDEST_BIT_SIZE;
unsigned sourcetype : SOURCETYPE_BIT_SIZE;
unsigned opsource : OPSOURCE_BIT_SIZE;
unsigned funct : FUNCT_BIT_SIZE;
unsigned E : E_BIT_SIZE;
unsigned R : R_BIT_SIZE;
unsigned A : A_BIT_SIZE;
} be;
} command_byte;
int main(void)
{
command_byte stuff={{0,}};
stuff.le.opcode = 0x7f;
printf("Le = %x\n", (unsigned) stuff.le.opcode);
printf("Be = %x\n", (unsigned) stuff.be.opcode);
return 0;
}