c语言 - 如何忽略警告"excess elements in struct initializer"



我想在c(gcc)中使用关键字参数,我遵循这个链接

内容如下:

#include <stdio.h>      // printf
#include <stdbool.h>    // bool - there's a bool type now
// Macro that turns the kwargs into an struct
#define my_func(...) my_func_base(
    (struct user){.is_admin=false, __VA_ARGS__});
struct user {
    char *username;
    bool is_admin;
};
// The actual function - and yes there's single line comments too
void my_func_base(struct user u) {
    printf("Hello %sn", u.username);
}
int main(int argc, char *argv[]) {
    my_func(.username="Bob", .is_admin=true);
}

我可以调用函数pretty

my_func(.username="Peter");
my_func(.username="Bob", .is_admin=true);

它将预处理

my_func(.is_admin=false, .username="Bob", .is_admin=true); ///<is_admin is overwritten

当我编译代码时,我得到警告:

(near initialization for '(anonymous)')
warning: excess elements in struct initializer
(near initialization for '(anonymous)') 
warning: initialized field overwritten

我真的想把覆盖。我怎么能忽视这一点。用#pragma GCC diagnostic之类的。我搜索GNU警告选项,-Woverride-init/-Wno-override-init不工作。

我的gcc版本是

zodiac1111@debian:src_linux$ LC_ALL=en_US arm-linux-gcc -v
Using built-in specs.
Target: arm-unknown-linux-uclibcgnueabi
Configured with: /home/ldsh/rt9x5/linux/buildroot/buildroot/output/toolchain/gcc-4.3.5/configure --prefix=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-unknown-linux-uclibcgnueabi --enable-languages=c,c++ --with-sysroot=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/sysroot --with-build-time-tools=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/bin --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp --disable-multilib --disable-tls --enable-shared --with-gmp=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --with-mpfr=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --enable-threads --disable-decimal-float --with-float=soft --with-abi=aapcs-linux --with-arch=armv5te --with-tune=arm926ej-s --with-pkgversion='Buildroot 2011.05-dirty' --with-bugurl=http://bugs.buildroot.net/ : (reconfigured) /home/ldsh/rt9x5/linux/buildroot/buildroot/output/toolchain/gcc-4.3.5/configure --prefix=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-unknown-linux-uclibcgnueabi --enable-languages=c,c++ --with-sysroot=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/sysroot --with-build-time-tools=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/bin --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp --disable-multilib --disable-tls --enable-shared --with-gmp=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --with-mpfr=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --enable-threads --disable-decimal-float --with-float=soft --with-abi=aapcs-linux --with-arch=armv5te --with-tune=arm926ej-s --with-pkgversion='Buildroot 2011.05-dirty' --with-bugurl=http://bugs.buildroot.net/
Thread model: posix
gcc version 4.3.5 (Buildroot 2011.05-dirty) 

抑制此警告的正确选项是-Wno-override-init,例如:

gcc -pedantic -Wall -Wextra -Wno-override-init check.c

摘自man gcc(4.4.7,重点是我的):

-Woverride-init(仅限C和Objective-C)

如果已初始化且没有副作用的字段被重写,则发出警告使用指定初始化式.

此警告包含在-Wextra中。获取其他-Wextra警告如果没有这个,使用-Wextra-Wno-override-init .

注意,这也会影响数组的指定初始化式

这是一个警告,所以你不需要做任何事情,除了闭上眼睛,希望不会发生不好的事情。

这是警告,因为你有两个is_admin的初始化器,这通常不是你想要的。