Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保结构在GCC中完全初始化(按名称)?_C_Gcc - Fatal编程技术网

如何确保结构在GCC中完全初始化(按名称)?

如何确保结构在GCC中完全初始化(按名称)?,c,gcc,C,Gcc,当使用指定的初始值设定项时,如何确保在GCC中初始化结构的每个字段?(我对函数指针特别感兴趣)(我使用C不是C++)< /P> 以下是一个例子: typedef struct { int a; int b; } foo_t; typedef struct { void (*Start)(void); void (*Stop)(void); } bar_t; foo_t fooo = { 5 }; foo_t food = {

当使用指定的初始值设定项时,如何确保在GCC中初始化结构的每个字段?(我对函数指针特别感兴趣)(我使用C不是C++)< /P> 以下是一个例子:

typedef struct {
    int a;
    int b;
} foo_t;

typedef struct {
    void (*Start)(void);
    void (*Stop)(void);
} bar_t;

foo_t fooo = { 
        5 
    };

foo_t food = { 
        .b=4 
    };

bar_t baro = {
        NULL
    };

bar_t bard = { 
        .Start = NULL
    };
-Wmissing字段初始值设定项根本没有帮助。它只在GCC中对fooo起作用(mingw 4.7.3,4.8.1),而clang的效果稍好一些(对食物和巴德没有警告)

我确信不为指定的初始值设定项生成警告是有原因的(即使我明确要求),但我想要/需要它们。我不想基于顺序/位置初始化结构,因为这样更容易出错(例如,交换Start和Stop甚至不会给出任何警告)。gcc和clang都不会给出任何关于我未能显式初始化字段(按名称初始化时)的警告。出于多种原因,我也不想在代码中乱放if(x.y==NULL)行,其中一个原因是我想要的是编译时警告,而不是运行时错误

至少splint会在所有4种情况下给我警告,但不幸的是我不能一直使用splint(它阻塞了一些代码(无法解析一些C99、GCC扩展))

注意:如果我使用的是实函数而不是空函数,GCC也会为baro(但不是bard)显示警告

我搜索了google和stack overflow,但只找到了相关的问题,并没有找到这个特定问题的答案。 我发现的最佳匹配是“确保结构中的所有元素都已初始化” 它问了几乎相同的问题,但没有令人满意的答案

有没有我没有提到的更好的方法来处理这个问题?
(可能是其他代码分析工具?最好是可以集成到Eclipse或Visual Studio中的(免费)工具…

您展示的四种方法都初始化了结构的其余部分。它被初始化为0(或等效的类型)。

如果我没有弄错的话,C标准指定其他字段被自动初始化为0

所以,您所要求的—字段未初始化时出现编译错误—将与C(modern?)规范不符

C99标准,第127页,共页:

如果括号内列表中的初始值设定项少于元素或成员 用于初始化已知数组的聚合或字符串文字中的更少字符 尺寸大于阵列中的元素,则骨料的剩余部分应为 与具有静态存储持续时间的对象隐式初始化相同

gcc
s
-Wmissing字段初始值设定项
记录为不使用指定的初始值设定项发出警告。有一个增强请求
-Wmissing field initializers=2
,该请求随后还会发出警告:


所以我建议你将你的愿望添加到bug报告中,或者甚至提供一个补丁。从我使用开源软件的经验来看,添加补丁是最好的。

您链接的问题中有一个建议splint的答案。谢谢,您完全正确,但我特意使用了“显式初始化”这一短语。我还说过,我不想在运行时检查空函数指针,因为我知道丢失的字段被初始化为0。(参考的questin I beleive中也给出了相同的解释。)C99是合法的,并不意味着它不能发出我要求的警告。从gcc文档判断,
-Wmissing field initializers
中没有明确包含它的原因一定存在。