解决构建警告 - “#include指令末尾有额外的标记”

3
我正在测试我在先前的问题中尝试过的解决方案:在结构体内使用typedef为命名和索引文本命令
然而,我希望保持我的编译器警告为零。我使用静态代码分析工具来达到此目的,在某些工具(如:LINT)的情况下,我可以使用我的注释中的标记在每行上手动排除某些规则和警告。
对于第一个/顶部答案,我尝试了该解决方案,但修改了最终结构,使其看起来像这样:
struct command commands[] =
{
#include "commands.inc",
{NULL, NULL}
};

我希望在搜索过程中,能够知道是否已经到达该结构体数组中最大可寻址成员,以避免越界情况。但问题是,我现在收到了一个编译器警告:"警告:#include指令末尾有多余的标记"。有没有办法禁用这个警告?我很喜欢这个解决方案,它非常适合我的需求。



最终,我更新了我的.inc文件如下:

CMD(list),
CMD(quit),
CMD(start),

替代

CMD(list),
CMD(quit),
CMD(start)

接下来,我成功地从我的宏定义和静态初始化代码中删除了尾随逗号。

2个回答

14
您应该删除#include指令末尾的逗号。 不应该有这个逗号。

我需要它在那里,这样我就可以声明下一个由null组成的元素。 - Cloud
@GirLovesTacos: 然后将逗号移至下一行。 以开头的行用于预处理器,编译器不会看到它们。 - wallyk
你真的不需要那个逗号,它应该由 #define 生成,就像你在 SO 链接中建议的那样 - #define COMMAND(NAME) { #NAME, CMD_ ## NAME },... - Agnius Vasiliauskas

1

可能是因为尾随逗号引起的问题。请尝试:

struct command commands[] =
{
#include "commands.inc"
, {NULL, NULL}
};

不幸的是,这会导致编译器出错并破坏构建。 - Cloud
啊,我没注意到宏中已经有逗号了。那么@Tony The Lion的评论是正确的。这个宏将为您提供逗号,以声明下一个由NULL组成的元素。 - JoeFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接