我想在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的初始化器,这通常不是你想要的。