#include * not *后面跟<filename>或“filename”?</filename>

时间:2013-11-11 12:24:36

标签: c include c-preprocessor misra

来自MISRA-C 2004

  

19.3(req):'#include'指令后跟<filename>"filename"序列。

有什么替代方案? #include<filename>以外的其他内容可以"filename"吗?

编辑:他们是指#define d预处理器变量吗?

4 个答案:

答案 0 :(得分:0)

至少一些预处理器支持“计算包含”,即#include指令后面可能跟一个预处理器宏,它必须(最终)扩展为"filename"<filename>。所以,是的,我相信这条规则是在#include指令中排除这种宏扩展。

答案 1 :(得分:0)

是的,您实际上可以为文件使用预处理器宏。参见例如C11规范中的§6.10.2/ 4:

  

表单

的预处理指令
# include pp-tokens new-line
     允许使用

(与前两种形式中的一种不匹配)。预处理   在指令中包含后的标记将按正常文本处理。

宏必须扩展为有效的包含文件,因此必须扩展为"filename"<filename>

答案 2 :(得分:0)

我手边没有MISRA C:2004的副本,但我的回忆是规则19.3与新版本MISRA C:2012中的规则20.3相同。

后者包括以下放大:

  

此规则适用于执行宏替换后

因此,以下是可以接受的:

#define FILENAME "filename.h"
#include FILENAME

这些示例也表明这符合要求。

因此,即使MISRA-C:2004规则19.3在这方面没有明确规定,MISRA C:2012规则20.3也显示了澄清。

答案 3 :(得分:0)

这是规则的典型示例,仅用于静态分析器。 C标准规定如果#include不遵循两种标准形式中的任何一种,则调用未定义的行为。为了阻止这种(罕见的)未定义的行为出现在任何地方,通过静态分析,他们需要一个规则。