来自MISRA-C 2004:
19.3(req):'#include'指令后跟
<filename>
或"filename"
序列。
有什么替代方案? #include
或<filename>
以外的其他内容可以"filename"
吗?
编辑:他们是指#define
d预处理器变量吗?
答案 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
不遵循两种标准形式中的任何一种,则调用未定义的行为。为了阻止这种(罕见的)未定义的行为出现在任何地方,通过静态分析,他们需要一个规则。