This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28335:如何在编译时初始化联合体

Guru**** 2999690 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/925261/ccs-tms320f28335-how-to-initialize-union-at-compile-time

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我想知道是否可以使用#define init_Xb 初始化以下联合体/结构的每个位

struct X_bits{

   uint16 A1:1;
   uint16 A2:1;
   uint16 A3:1;
   uint16 A4:1;
   uint16 A5:1;
   uint16 A6:1;
   uint16 A7:1;
   uint16 A8:1;
   uint16 A9:1;
   uint16 A10:1;
   uint16 A11:1;
   uint16 A12:1;
   uint16 A13:1;
   uint16 A14:1;
   uint16 a15:1;
   uint16 A16:1;
   };
   
   typedef union X_B{
      uint16         全部;
      struct         X_bits;
   } regXB;    

#define INIT_XB ={1、1、1、0、0、0、1、1、1、0、0、0}

可以在编译时执行它吗?

regXB   RxB = init_XB;

此致、

谢谢、Jorge

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可以通过几种不同的方法来实现它。  这是一个...

    #include 
    
    typedef uint16_t uint16;
    
    struct X_bits{
    uint16 A1:1;
    uint16 A2:1;
    uint16 A3:1;
    uint16 A4:1;
    uint16 A5:1;
    uint16 A6:1;
    uint16 A7:1;
    uint16 A8:1;
    uint16 A9:1;
    uint16 A10:1;
    uint16 A11:1;
    uint16 A12:1;
    uint16 A13:1;
    uint16 A14:1;
    uint16 a15:1;
    uint16 A16:1;
    };
    
    typedef union X_B{
    struct X_bits 位;
    uint16 all;
    }regXB;
    
    #define init_XB{1、1、1、0、0、0、1、1、1、0、0、0}
    
    regXB global_bits = init_XB; 

    我将逐一介绍这一点。  从...开始

    #include 
    
    typedef uint16_t uint16;
    

    这是定义 UINT16类型的一种方法、在代码的其余部分中使用该类型。  每个 C 编译器都可以使用头文件 stdint.h (旧编译器除外)。  除其他外、它定义了多种固定宽度类型、其中一种是 uint16_t  这里使用它来定义类型 UINT16。   

    定义联合体时...

    typedef union X_B{
    struct X_bits 位;
    uint16 all;
    }regXB;
    

    结构 X 首先出现。  这是因为、当在后面的行上初始化时、初始化值会应用于联合体的第一个成员。

    在预处理器符号 init_xb 的定义中...

    #define INIT_XB{1、1、1、0、0、0、1、1、1、0、0、0} 

    没有等号。

    这一行...

    regXB global_bits = init_XB; 

    (笑声) 创建一个名为 global_bits 的类型 regXB 的全局变量。  它通过扩展预处理器符号 INIT_XB 进行初始化。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒!!! 谢谢!!! 

    还有一个问题,是否可以使用第二个成员(全部)初始化相同的结构?

    谢谢、此致
    豪尔赫
    
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Jorge Idiart"]是否可以使用第二个成员(全部)初始化相同的结构?[/quot]

    C99 C 标准引入了一个名为指定初始化程序的新功能。  在您的情况下,您可以像这样使用它...

    regXB global_bits ={.all = 0xf0f0}; 

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治
    谢谢。
    上述初始化会出现以下错误:
    "错误:需要表达式"
    此致、Jorge。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Jorge Idiart)]上述初始化会出现以下错误:
    "error:Expected an expression"项目使用哪个编译器版本和选项?

    在 C99中引入了 George 示例中所示的指定初始化程序。 例如、对于 C2000 v20.2-1编译  器、如果使用了--C89 --strict_ansi 选项来严格符合 C89、则使用指定的初始化程序会失败、并显示"error #29:Expected an expression"。

    而使用-c99  -strict_ansi 选项则允许使用 指定的初始化程序。

     使用 C99功能不需要使用-strict_ansi、但我只是将其与-c89和-c99结合使用来演示在哪些条件下使用  指定的初始化程序会生成编译器错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    切斯特、您好!

    感谢你的帮助

    我使用的是 Code Composer 3.3

    BUID 工具:

    德州仪器 C2000代码生成工具

    ...C2000代码生成工具5.2.11/bin/cl2000 "-g -pm -pdsw225 -o2 -fr"

    您能告诉我添加-c99 -strict_ansi 选项的位置吗?

    谢谢!

    此致、Jorge

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    C2000编译器5.2.11版不支持 C99标准、这意味着它不支持指定的初始化程序。  这意味着我在上一个帖子中提出的建议不起作用。  在这种情况下、没有方法可以用于初始化 UNION 的第二个成员。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 George!

    此致、Jorge