2011-11-23 92 views
2

“在#include指令的末尾额外令牌”我测试的解决方案我前一个问题的尝试:Use typedef within struct for naming and indexing text commands解决生成警告 -

不过,我想保持我的编译器警告无法比拟的。为此我使用静态代码分析工具,对于某些工具(例如:LINT),我可以在评论中使用标记手动排除某些规则和警告。

在第一/顶部回答的情况下,我试过了解决方案,但修改后的最终结构看起来像这样:

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

这是这样我就可以知道,如果,在搜索过程中,我已经到达这个结构数组中最大的可寻址成员并且没有得到一个超出界限的条件。问题是我知道有一个编译器警告,“警告:#include指令结尾处的额外令牌”。有什么办法可以禁用这个警告吗?我喜欢这个解决方案,它非常适合我的需求。



最后,我更新了我的。公司文件是像这样:的

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

代替

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

然后我能够删除尾随逗号从我的宏定义和我的静态初始化代码。

回答

12

您应该在#include指令末尾删除逗号。它不应该在那里。

+0

我需要它有这样我就可以宣布由空的下一个元素。 – DevNull

+0

@GirLovesTacos:然后将逗号移到下一行。以'#'开头的行代表预处理器,不会被编译器看到。 – wallyk

+0

你真的不需要这个逗号,它应该用#define来生成,就像在你建议的SO链接中一样###define COMMAND(NAME){#NAME,CMD_ ## NAME},'... –

1

这可能是最后的逗号翻转。尝试:

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

不幸的是, ,这会导致编译器错误并中断构建。 – DevNull

+0

啊,我没有注意到这个宏已经有了逗号。然后@Tony狮子的评论是正确的。宏会给你你需要声明下一个由NULL组成的元素的逗号。 – JoeFish