您的位置:首页 > 其它

MISRA C指导指南解读系列8(MISRA C规则87-100)

2009-05-05 13:41 316 查看

2.1. 预处理

87.文件中#include语句前面只能是其它的预处理语句或注释(R)

例如:
static int a;
#include <stdio.h> /*与规则87冲突*/
……
88.非标准字符不能出现在#include语句的头文件名称中(R)
不允许在<>之间出现',/,",/*等字符,并且在""中也不能出现',/,/*等符号。
89.#include指示的后面应该是<filename>或”filename”(R)
90.C宏定义的符号只能表示常数,类函数的宏,类型限制,和存储类标示(R)
例如:
/* 以下是可以的 */
#define PI 3.14159f /* 常数 */
#define PLUS2(X) ((X) + 2) /* 类函数宏 */
#define STOR extern /* 存储类型标示 */

/* 一下是不允许的 */
#define SI_32 long /* 使用typedef替代该定义 */
#define STARTIF if( /* 非常不好 */
91.宏不能在块中进行#define和#undef定义(R)
#define PI 3.1415926f /*OK*/

int myfunc(void) {
#define EXP 2.3f /* 与规则冲突 */
}
92.#undef不应该被使用(A)
93.函数的使用应该优先于类函数的宏(A)
虽然类函数的宏比函数更高效,但是健壮性较差,函数会进行参数检查。
94.没有使用所有参数的情况下不能使用类函数宏(R)

95.用于类函数宏的参数不能包含类似预处理指示符的标示(R)
这主要是防止不可预测的参数值,例如空置
例如
#define NDATA() ()
#define MAX(a, b) ((a) > (b) ? (a) : (b))
void myfunc()
{
int a, b;
a = MAX(b, NDATA()); /* 与规则95冲突 */
}
96.在宏定义的类函数宏中,所有的实例化参数都要使用括号(R)
例如
#define MINOR(x) (x-1) /* 与规则96冲突 */
97.预处理标示中使用的标识符应在使用前定义(A)
#if MYMACRO < 0 /*如果MYMACRO没有定义,则默认为0*/

98.在一个宏定义中,最多可以出现一个# 或 ##预处理操作符(R)

/* OK */

#define TEST(A,B) A # B

/* OK */
#define TEST2(A,B) A ## B

/* 与规则98冲突 */
#define TEST3(A,B,C) A # B # C

/* 与规则98冲突 */
#define TEST4(A,B,C) A ## B # C

/* 与规则98冲突 */
#define TEST5(A,B,C) A ## B ## C
99.所有使用的#pragma指示符应该文档化并进行解释(R)
100.所有定义的预处理操作应该采用两种标准格式中的一种(R)
在标准C中,#define identifier 和 #define (identifier)是被定义的两种格式。

## 是连接符号,连接两个字符串
#是把名字代替成参数中的字符串
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: