【问题标题】:Struct Declaration: Valid initializer in declaration?结构声明:声明中的有效初始化程序?
【发布时间】:2023-12-01 05:48:02
【问题描述】:

我在 IDE (Netbeans) 中声明一个结构,如下所示:

struct foo { size_t var = 1; }

IDE 说它是合法的。我编译了这个项目(它是一个静态库..),编译器说它是合法的(不抱怨或抛出)。

现在,由于此时我只是在测试语法,所以当我在我的程序中声明此标记的结构时,我必须询问可能知道这是否真的有效的人:

struct foo myfoo;

所以问题是:这是一个有效的初始化程序吗? (size_t var = 1) 还是编译器只是在这里抚摸我的自我?我在谷歌或类似的文档中没有找到任何东西,所以我猜它不会像我希望的那样工作。

*edit 所以我和这里的好兄弟@SO 发现它将在调试配置中编译,而不是在发布配置中编译。谁说一头不如一两千? :D

【问题讨论】:

  • 查看相关问题*.com/questions/330793/…
  • @TJD 现在既快又棒!谢谢。但我仍然不明白为什么 GCC 和 IDE 让它溜走而没有呻吟。刚刚把警告调高了……我仍然能听到蟋蟀的啁啾声。大声笑。
  • 你使用的是什么版本的 gcc?我刚刚尝试使用 4.4.3,但出现错误 expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
  • 是的,我只是在发布模式和调试模式下自己检查了它。最初我处于调试模式。如果在发布模式下尖叫,它将无法编译。
  • 听起来像是预发行版中的一个错误。你应该让 gcc 团队知道。

标签: c struct declaration definition


【解决方案1】:

我认为这是不允许的。您需要指定变量的值,而不是结构:

struct foo { size_t var; };

struct foo myfoo = { 1 };

至于允许它的IDE,很明显的可能是代码确实有点不同,例如:

struct foo { static const size_t var = 1; }

...并且 IDE 将其编译为 C++ 而不是 C。

【讨论】:

  • 无论发生什么都是一件奇怪的事情。也许这是我的下一个问题。 “为什么这不会标记编译警告?”
  • @TristonJ.Taylor 你能告诉我们是什么原因吗?您使用的是 C++ IDE 吗?
  • @PavanManjunath C++ 在 C 项目中兼容,在 C 文件中 在“调试模式”下使用 GCC
  • 好的,做到了!调试配置是罪魁祸首!
【解决方案2】:

简单的答案是:你不能在结构定义中进行初始化,所以如果编译器允许你这样做,就会发生一些奇怪的事情。

要初始化,您必须在 var(或对象,如果您要这样做)中实例化该结构并初始化该 var。

所以,对于你的结构:

struct foo {
    size_t var = 1;
}


你会初始化为:

type function_name(...params...) {
    struct foo myFooVar;
    myFooVar.var = 1;
    ....
    return <type>;
}

【讨论】:

  • 感谢您的回答! “发生了一些奇怪的事情......” DeJa Vu.. lol 换句话说:我的情绪完全......
  • 你能确认这个错误吗? gcc (GCC) 4.7.0 20120407 (prerelease)
  • 找到它:一个项目的调试配置会让那个滑动,释放模式会引发来自中土的龙之火..或类似的东西。