【问题标题】:Making GNU indent handle struct literals properly使 GNU 缩进正确处理结构文字
【发布时间】:2015-05-05 01:22:57
【问题描述】:

当我尝试在这段代码上使用 GNU 缩进时:

tree_node_s *t = GC_MALLOC_ATOMIC (sizeof (tree_node_s));
*t = (tree_node_s){.val = n,.h = 0};

我明白了:

tree_node_s *t = GC_MALLOC_ATOMIC (sizeof (tree_node_s));
*t = (tree_node_s)
  {
  .val = n,.h = 0};

现在显然,这看起来很糟糕,显然不是结构字面量。我只将默认选项传递给 GNU 缩进(意味着是 GNU 样式)。有没有我可以传递给它的选项,让它以一种最终看起来不会那么可怕的方式来处理这种情况?

【问题讨论】:

  • 我不得不报告在另一个格式化程序uncrustify 中处理复合文字的错误。它很快得到解决,但听到另一个程序忽略了这个问题我并不感到惊讶。
  • 我主要是问这个问题,所以当我报告这个错误时,我看起来不像个白痴!

标签: c indentation gnu


【解决方案1】:

至少在2.2.11 中似乎有些工作,但在块外的复合语句中可能存在另一个问题(查看 bugzilla 链接)。如果您使用旧版本,您可以升级并重试。

只是一个建议。

【讨论】:

  • 这就是我正在使用的版本 - 这会导致这种确切的行为。
  • 我认为 indent 只是将花括号作为其(过度?)简化解析器中的块,而不关心查找前面复合语句标记的分配(iffor, ...)。也许在这里使用 Linux 风格的缩进可能看起来更好,但我想这是不可能的? (这可能是 gmame 示例中使用的样式)。
  • 我不认为这是使用哪种样式的问题 - 这是错误的行为,根据我在这里看到的回复,我认为我应该将其报告为错误。
  • 这就是为什么我说“......看起来更好......”。这只是为了格式化。当然,复合语句的实际问题不会因此得到解决。
【解决方案2】:

如果“tree_node_s”不止一个内在变量(如 int、char 等),则发布的代码将无法正常工作

这是因为从结构分配结构仅在创建接收结构时才有效。在发布的代码中,接收结构已经创建,因此不会执行正确的分配。

建议:

t->val = n;
t->h = 0;

也许没有那么优雅,但非常可靠。

【讨论】:

  • 这不是 gcc 扩展,而是自 C99 以来的标准 C。直接分配也可以,可能只会导致隐式 memcpy。每次添加或(重新)移动结构字段时,都必须修改您的建议。此外,分配保证将未指定的字段归零,而您的则将它们保留为随机值。我不会称之为优雅,也不可靠 - 抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2015-05-30
  • 2013-12-02
  • 2012-10-10
相关资源
最近更新 更多