0

MISRA-C 2004开始:

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

什么是替代方案?后面可以跟or#include以外的东西吗?<filename>"filename"

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

4

4 回答 4

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 也做出了澄清。

于 2013-11-13T16:51:13.923 回答
0

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

于 2013-11-11T12:32:19.063 回答
0

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

形式的预处理指令

# include pp-tokens new-line

(与前两种形式之一不匹配)是允许的。指令中包含后的预处理标记的处理方式与普通文本一样。

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

于 2013-11-11T12:32:32.067 回答
0

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

于 2015-06-01T10:59:49.670 回答