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*/2.1. 预处理
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)是被定义的两种格式。
## 是连接符号,连接两个字符串
#是把名字代替成参数中的字符串