如果我初始化一个结构但错过了一个元素,那么在GCC中警告我的任何标志?

时间:2014-02-10 07:32:01

标签: c gcc struct warnings compiler-warnings

假设我有这个结构

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”---在我给出的例子中很容易检测到的错误,但是在更复杂的结构,特别是开发不足的情况下,这绝对是合理的

有没有我可以传递给的旗帜,如果我这样搞砸了会导致它产生警告?

2 个答案:

答案 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)

  1. 您必须将“-W”选项传递给gcc。
  2. 用户bar.a而不是代码中的.a。
  3. 如果使用“gcc -W test.c”命令编译代码

    ,则可以看到以下警告消息
    test.c:11: warning: missing initializer
    test.c:11: warning: (near initialization for âbar.câ)