include 指令应符合标准格式
3.1.1 ID_illFormedInclude
#include 后只应为 < 头文件路径 > 或 " 头文件路径 ",否则会导致标准未定义的行为。
示例:
#include <string.h> // Compliant
#include "string.h" // Compliant
#define HEADER "string.h"
#include HEADER // Compliant
#include stdlib.h // Non-compliant, undefined behavior
例中对 string.h 的引用符合标准,而对 stdlib.h 的引用会导致标准未定义的行为。
注意,由引号标识的头文件路径并非字符串常量,不应对其使用字符串常量的特性,如:
#include "stdlib" ".h" // Non-compliant, implementation defined
例中 "stdlib" ".h" 是否会被连接成 "stdlib.h" 由实现定义,存在可移植性方面的问题。
另外,如下形式的代码也是不符合标准的:
#include L"foo" // Non-compliant
#include u"bar" // Non-compliant
#include U"baz" // Non-compliant
#include R"(..\foo\bar)" // Non-compliant
相关
依据
ISO/IEC 9899:1999 6.10.2
ISO/IEC 9899:2011 6.10.2
ISO/IEC 14882:2003 2.8
ISO/IEC 14882:2003 16.2(4)-undefined
ISO/IEC 14882:2003 16.2(4)-implementation
ISO/IEC 14882:2011 2.9
ISO/IEC 14882:2011 16.2(4)-undefined
ISO/IEC 14882:2011 16.2(4)-implementation
参考
MISRA C 2004 19.3
MISRA C 2012 20.3
MISRA C++ 2008 16-2-6