How to remove the warning in gcc 4.6: missing init

2019-04-10 15:00发布

The code:

  GValue value = { 0 };

Give the following warning:

missing initializer [-Wmissing-field-initializers]

I know that's a gcc's BUG; but is there some trick to remove it? really not nice see such unreal warnings. But I don't want power off the warning because it will hidden real warnings from me too. A sorry, but I can't update my gcc to 4.7(where looks like it was fixed) version, yet.

3条回答
姐就是有狂的资本
2楼-- · 2019-04-10 15:06

It also appears that using the .field-style of initialization, such as:

GValue value = { .somefield = 0 };

will cause the compiler to not issue the warning. Unfortunately if the struct is opaque, this is a non-starter.

查看更多
Bombasti
3楼-- · 2019-04-10 15:08

Use G_VALUE_INIT to initialize GValue-s. Their (private) structure is in /usr/include/glib-2.0/gobject/gvalue.h which #define G_VALUE_INIT appropriately.

I strongly disagree with your assessment that it is GCC's bug. You ask to be warned if a field is not explicitly initialized with -Wmissing-field-initializers and you get the warning you deserve.

Sadly G_VALUE_INIT is not documented, but it is here. Code with

GValue value = G_VALUE_INIT;

There is no universal solution to never get the warning about missing field initialization if -Wmissing-field-initializers is asked. When you ask for such a warning, you require the compiler to warn of every incomplete initializers. Indeed, the standard requires than all the non-explicitly initialized struct fields be zeroed, and gcc obeys the standard.

You could use diagnostic pragmas like

#pragma GCC diagnostic ignored "-Wmissing-field-initializers"

But my feeling is that you should code with care, and explicitly initialize all the fields. The warning you get is more a coding style warning (maybe you forgot a field!) than a bug warning.

I also believe that for your own (public) struct you should #define an initializing macro, if such struct are intended to be initialized.

查看更多
Emotional °昔
4楼-- · 2019-04-10 15:26

You could use:

-Wno-missing-field-initializers

to inhibit that warning specifically. Conversely, you could make it into an error with:

-Werror=missing-field-initializers

Both of these work with GCC 4.7.1; I believe they work with GCC 4.6.x too, but they don't work with all earlier versions of GCC (GCC 4.1.2 recognizes -Wno-missing-field-initializers but not -Werror=missing-field-intializers).

Obviously, the other way to suppress the warning is to initialize all fields explicitly. That can be painful, though.

查看更多
登录 后发表回答