【问题标题】:Initializing a constant structure初始化常量结构
【发布时间】:2018-10-18 19:27:31
【问题描述】:

我想在 Flash 中创建一个常量结构。此结构将由各种大小的元素组成,包括字符串数组、short、字节等。字符串应该以空值结尾,但可能不会完全填满为其分配的数组存储区域。下面显示的代码是我的,但是编译器给出了以下错误。

../Source/flash_constants.h:1025:33: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token
   const unsigned char Reg00[32] = "My String 1";

const unsigned char Reg00[32] = "My String 1"; 是结构定义之外的有效语句,但在结构定义内部失败。

谢谢。

struct
{
  const unsigned char Reg00[32] = "My String 1";
  const unsigned char Reg01[32] = "My String 2";
  const unsigned char Reg02[32] = "My String 3";
  const unsigned short Reg03 = 0;
  const unsigned short Reg04 = 0;
} ModBusIDReg;

【问题讨论】:

标签: c struct constants


【解决方案1】:

您不能在 C 中对结构进行内联初始化。

你需要定义结构,定义变量,然后初始化变量:

struct
{
  const unsigned char Reg00[32];
  const unsigned char Reg01[32];
  const unsigned char Reg02[32];
  const unsigned short Reg03;
  const unsigned short Reg04;
} const ModBusIDReg = {
    "My String 1",
    "My String 2",
    "My String 3",
    0,
    0
};

【讨论】:

  • 在结构定义之外初始化结构元素有效。谢谢 !但是,这也有点让人头疼。我有 100 个这样的元素要定义,现在初始化与定义有些脱节(视觉上)。例如,第 53 个初始值设定项在视觉上与第 53 个定义相距甚远。我看到很多计数,并检查以确保它们排成一行。
  • @GregoryHelton 然后使用the answer by малин чекуров 中的指定初始化程序 可能是一个解决方案。或者考虑一个不需要那么多成员的设计。
【解决方案2】:

您也可以使用指定的初始化器(C99),它不限制您按固定顺序初始化成员:

struct
{
  const unsigned char Reg00[32];
  const unsigned char Reg01[32];
  const unsigned char Reg02[32];
  const unsigned short Reg03;
  const unsigned short Reg04;
} const ModBusIDReg = {

    .Reg01 = "My String 2",
    .Reg00 = "My String 1",
    .Reg02 = "My String 3",
};

没有显式初始化的成员被初始化,就好像实例具有静态持续时间一样,因为 C 没有部分初始化。

【讨论】:

  • 我以前从未见过这种用于结构初始化的语法。感谢您的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2014-05-25
  • 2015-11-09
  • 2011-12-25
  • 1970-01-01
  • 2020-08-14
相关资源
最近更新 更多