【问题标题】:define a struct if a certain condition is met如果满足某个条件,则定义一个结构
【发布时间】:2020-07-05 04:51:27
【问题描述】:

如果我所在的机器是小端,我想以某种方式typedef一个结构,如果它是大端,我想以其他方式。我试过了:

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 语句中定义结构的有效方法。我也不确定当我实际使用该结构时它是否会起作用。也会在头文件上工作吗?如果满足条件,定义结构的正确方法是什么?

【问题讨论】:

  • @kabanus 我知道在不同架构之间会损害谁,我的问题是关于 if 语句中结构的定义
  • @avigood2 #if IS_BIG_ENDIAN .... #ELSE?有些答案有这样的结构。
  • stackoverflow.com/a/9283155/6881240 有一个例子。而不是#error 定义你的结构。
  • @avivgood2 目标机器的字节序必须在 compile 时知道,因此将它放在运行时评估的 if ... else ... 中没有意义.你当然不希望 same 可执行文件在 both 小端和大端机器上运行,所以这样做你总是有一块死代码为特定目标编译时从不执行。

标签: c if-statement struct typedef c89


【解决方案1】:

是的,您可以像这样使用if。但是 typedef command_type 只能在定义它的最里面的包含块中使用。

因此与定义typedef ... command_type_big_endiantypedef ... command_type_little_endian 相比没有优势,您不能以任何方式共享代码。

您可以使用预处理器来帮助避免重复;那么您可以只编写一次 serializationdeserialization 宏的大部分内容,并为每个 command_type 变体实例化它。

【讨论】:

    【解决方案2】:

    您可以同时定义它们,并将它们放在一个联合中:


    #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;
    }
    

    【讨论】:

    • 是的,但是我怎么知道要引用什么结构呢?每次使用时我都必须检查应该使用哪一个
    • 在某些时候,您的编译器(或(反)汇编器)将不得不决定它必须处理哪种代码。
    • 什么编译器?你是说 gcc 吗?
    • 你正在构建的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多