我想在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
答案 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的初始化程序,通常不是你想要的。