现在的位置: 首页 > 综合 > 正文

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

2018年04月28日 ⁄ 综合 ⁄ 共 1439字 ⁄ 字号 评论关闭

2.1.            预处理

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

       例如:

              static int a;

              #include <stdio.h>  /*与规则87冲突*/

              ……

88.非标准字符不能出现在#include语句的头文件名称中(R

              不允许在<>之间出现'/"/*等字符,并且在""中也不能出现'//*等符号。

89#include指示的后面应该是<filename>”filename”R

90C宏定义的符号只能表示常数,类函数的宏,类型限制,和存储类标示(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)是被定义的两种格式。

 

 

## 是连接符号,连接两个字符串
#是把名字代替成参数中的字符串

抱歉!评论已关闭.