假设我有这个结构
typedef struct foo {
int a;
char b;
char *c;
} foo;
我想创建一个struct
的初始化实例foo bar = { .a = 7 .b = 'x' .c = "hello" };
然而,如果我陷入困境并且忘记来初始化我正在初始化的结构的一个元素......例如......
foo bar = { .a = 7, .c = "hello" };
...我只是忘了初始化元素“b”---在我给出的例子中很容易检测到的错误,但是在更复杂的结构,特别是开发不足的情况下,这绝对是合理的
有没有我可以传递给gcc的旗帜,如果我这样搞砸了会导致它产生警告?
答案 0 :(得分:1)
使用“old school” ISO C初始化结构的方式(当不使用-std=c99
进行编译时),gcc默认会给你一个警告。除此之外,您需要设置的gcc标志为-Wmissing-field-initializers
,默认情况下启用AFAIK 默认情况下启用 NOT ,但是{{}的一部分1}},正如Michael Burr在他的评论中所说的那样,只要你使用以下语法:
-Wextra
这应该发出以下警告:
warning: initialization makes integer from pointer without a cast [enabled by default] foo bar = { 123, "foobar"}; warning: missing initializer for field ‘c’ of ‘foo’ [-Wmissing-field-initializers] foo zar = { 123, 'a'};
当然,这样做的主要缺点是它会使您的代码更难以阅读和维护......而不是微不足道的IMO ......
如果可以,如果开销不是太糟糕,我只需编写一个函数。特别是考虑到你有一个int main ( void )
{
foo bar = {123, "foobar"};//failed to init char b member
foo zar = {123, '\a'};//omitted c initialization
return 0;
}
成员字段,可能需要堆分配的内存:
char *
这是最安全的方式......像这样调用这个函数:
foo * init_foo(foo *str, int a, char b, char *c)
{
if (c == NULL) return NULL;// no char pointer passed
if (str == NULL) str = malloc(sizeof *str);//function allocates struct, too
str->a = a;
str->b = b;
str->c = calloc(strlen(c) + 1, sizeof *(str->c));//allocate char pointer
strcpy(str->c, c);
return str;
}
//optionally include custom free function:
void free_foo ( foo **f)
{
if ((*f)->c != NULL) free((*f)->c);
free(*f)
*f = NULL;//init pointer to NULL
}
无论如何,在开发过程中,总是使用foo *new_foo = init_foo( NULL, 123, '\a', "string");//allocate new struct, set all members
//free like so:
free_foo(&new_foo);//pass pointer to pointer
foo stack_foo;
init_foo(&stack_foo, 123, '\a', "string");//initialize given struct
//only free .c member
free(stack_foo.c);
stack_foo.c = NULL;
进行编译,并且为了安全-Wall
也是......
答案 1 :(得分:-1)
如果使用“gcc -W test.c”命令编译代码
,则可以看到以下警告消息test.c:11: warning: missing initializer
test.c:11: warning: (near initialization for âbar.câ)