如果满足特定条件,则定义一个结构

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_endiantypedef ... command_type_little_endian 没有任何优势,您不能以任何方式共享代码。

您可以使用预处理器 来帮助避免重复;那么你可以只编写一次 serializationdeserialization 宏,并为每个 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;
}