3
#include <stdio.h>
#include <string.h>

typedef struct STest
{
  unsigned int uiRoll;
  unsigned short usiVal;
} TTest;

int main()
{
  TTest oTest = {0};  /* Initialize the Values with 0 */
  printf( "The values are: %d, %d\n", oTest.uiRoll, oTest.usiVal );
  return 0;
}

观察:

  1. 编译gcc -Wextra -o a aa.cpp
  2. 收到警告:warning: missing initializer for member STest::usiVal
  3. 我也尝试了 memset 函数,但仍然收到相同的警告。
  4. 第一个结构元素没有警告消息。

如何初始化结构?这样就没有警告信息了。

4

4 回答 4

1

为什么不初始化两个成员?

TTest oTest = {0, 0};

或者,可能更好:

TTest oTest = { .uiRoll = 0, .usiVal = 0};  

(这假设您确实在编写 C 代码,它应该使用gcc扩展 名..c.cppgcc

另一种选择:将编译器升级到 GCC >= 4.7.2(可能纯 4.7.0 就足够了)。该警告已被删除,您可以使用代码中的简短形式。

于 2013-05-01T12:44:24.257 回答
0

甚至:

TTest oTest;
memset(&oTest, 0, sizeof(oTest));

我没有收到警告。你是如何尝试使用 memset 的?

于 2013-05-01T12:47:54.053 回答
0

这个符号是最便携/正确的从零初始化结构:

#include <stdio.h>
#include <string.h>

typedef struct STest
{
  unsigned int uiRoll;
  unsigned short usiVal;
}              TTest;

int main()
{
  /* Static declaration causes structure member's to be zeroed at instanciation */
  static const TTest zeroed_struct;

  /* Structure assignement is then safely used */
  TTest oTest = zeroed_struct;
  printf( "The values are: %d, %d\n", oTest.uiRoll, oTest.usiVal );
  return (0);
}

声明静态 TTest结构会导致编译器自动将所有结构字段设置为零。然后,您可以安全地使用赋值运算符将结构成员的另一个实例初始化为零。

在我看来,像你一样使用通用零初始化器是正确的。尽管如此,我在 GCC bugtracker 上发现了这篇有趣的帖子,它可以解释为什么在你的版本上发出警告GCC,可能是一个4.4版本:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 。

于 2013-05-01T12:52:38.540 回答
0

除了在这种情况下 GCC 实际上可能是正确的事实之外,禁用警告的一般经验法则是为no-控制特定情况下发出警告消息的选项添加前缀。例如,如果您阅读 gcc 的手册页,它有以下内容:

聚合具有不初始化所有成员的初始化程序。此警告可以由 -Wmissing-field-initializers 独立控制。

因此,为了禁用此选项,您必须传递-Wno-missing-field-initializers给 GCC。

有趣的是,GCC 4.2.1 会发出此警告,而 GCC 4.7.2 不会发出此警告,即使该警告已明确启用。经过更多的实验,似乎如果您指定一个0,则不会发出警告。但是,如果您指定两个或多个字段但不是全部,则会出现警告。

希望能帮助到你。祝你好运!

于 2013-05-01T12:53:58.783 回答