1

我想创建一个 64 位数据结构,每个位都应该包含一个值。为此,我创建了一个结构如下。(这与J1939 协议和 ControlApplication NAME有关,以防万一)

typedef struct CA_NAME {
    unsigned  IdentityNumber : 21;          // 21 bits  Byte 1.1 to 3.5 
    unsigned  ManufactorerCode : 11;        // 11 bits  Byte 3.6 to 4.8 
    unsigned  ECUInstance : 3;              // 3  bits  Byte 5.1 to 5.3 
    unsigned  functionInstance : 5;         // 5  bits  Byte 5.4 to 5.8 
    unsigned  Function : 8;                 // 8  bits  Byte 6          
    unsigned  Reserved : 1;                 // 1  bit   Byte 7.1        
    unsigned  VehicleSystem : 7;            // 7  bits  Byte 7.2 to 7.8 
    unsigned  VehicleSystemInstance : 4;    // 4  bits  Byte 8.1 to 8.4 
    unsigned  IndustryGroup : 3;            // 3  bits  Byte 8.5 to 8.7 
    unsigned  ArbitraryAddressCapable : 1;  // 1  bit   Byte 8.8        
} CA_NAME; /*64Bit NAME*/

现在我想初始化一个对象实例CA_NAME

CA_NAME j1939 = {};

void Create_CA_NAME() {
    j1939.IdentityNumber = 0xFE0D32;
    j1939.ManufactorerCode = 0x57;
    ....
}

在这里,我得到实时分析错误(我猜来自 ReSharper)(即第一次分配) 在此处输入图像描述

初始化结构实例的正确方法是什么?

4

1 回答 1

1

该常量0xFE0D32有 24 个值位(并且确实是 类型int)。

IdentityNumber您正在尝试使用超出其范围的常量初始化一个无符号 21 位位域。编译器很友好地警告你这个潜在的错误。

此外,您编译为 C++,这解释了原因:

  • CA_NAME j1939 = {};在 C++ 中不会产生错误,但在 C 中会产生错误。实际上不需要初始化程序,因为j1939它是一个全局变量。如果您坚持使用显式初始化程序,请提供实际值或仅编写CA_NAME j1939 = { 0 };
  • 错误信息很深奥,让您领略了 C++ 的极度复杂性。
于 2019-02-11T20:56:55.387 回答