如何忽略警告“struct initializer中的多余元素”

时间:2014-08-06 09:35:00

标签: c gcc

我想在c(gcc)中使用关键字参数,我遵循this link

如下所示:

#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 %s\n", u.username);
}

int main(int argc, char *argv[]) {
    my_func(.username="Bob", .is_admin=true);
}

我可以调用函数漂亮

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 Warning Optings-Woverride-init / { {1}}无效。

我的gcc版本是

-Wno-override-init

2 个答案:

答案 0 :(得分:2)

禁止此警告的正确选项是-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

请注意,这也会影响数组的指定初始值设定项。

答案 1 :(得分:0)

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

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