从MISRA-C 2004开始:
19.3 (req): '#include' 指令后应跟 a
<filename>
或"filename"
序列。
什么是替代方案?后面可以跟or#include
以外的东西吗?<filename>
"filename"
编辑:他们指的是#define
d 预处理器变量吗?
从MISRA-C 2004开始:
19.3 (req): '#include' 指令后应跟 a
<filename>
或"filename"
序列。
什么是替代方案?后面可以跟or#include
以外的东西吗?<filename>
"filename"
编辑:他们指的是#define
d 预处理器变量吗?
我手头没有 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 也做出了澄清。
至少一些预处理器支持“计算的包含”,即#include
指令后面可能跟着一个预处理器宏,它必须(最终)扩展为"filename"
or <filename>
。所以,是的,我相信这条规则是在#include
指令中排除这种宏扩展。
是的,您实际上可以对文件使用预处理器宏。参见 C11 规范中的例如 §6.10.2/4:
形式的预处理指令
# include pp-tokens new-line
(与前两种形式之一不匹配)是允许的。指令中包含后的预处理标记的处理方式与普通文本一样。
宏必须扩展为有效的包含文件,因此必须扩展为"filename"
或<filename>
。
这是一个典型的规则示例,仅用于静态分析器。C 标准规定,如果 an#include
不遵循两种标准形式中的任何一种,则调用未定义的行为。为了通过静态分析阻止这种(罕见的)未定义行为出现在任何地方,他们需要一个规则。