3.1宏定义
3.1.1 数值宏常量
#define定义的常量从本行宏定义开始,以后代码都认识这个宏,任何东西都可定义为宏。
编译器在预处理时就会用真身替换替身
eg:
#define PI 3.141592654
以后的代码就可以用PI来代替3.141592654,这样的好处是如果你想提高精度,只需要修改一次。
#define定义的宏是没有类型的,而const修饰的数据是有类型的,为了安全建议以后定义宏常量时尽可能用const代替,编译器会给const修饰的只读变量做类型校检,减少错误。
eg:
#define MAX 100
建议使用
const int MAX=100
要注意const修饰的不是常量而是readonly变量,const修饰的只读变量不能用来作为定义数组的维数,也不能放在case关键字后面
eg:
int Array[MAX];
这个MAX可以用#define定义,但不能用const定义
#define FUN(a) "a"
int main()
{
char* str=FUN(345);
printf("%s\n",str); //输出结果:"a"
printf(FUN(345));//输出结果:"a"
printf("FUN(345)");//输出结果:"FUN(345)"
return 0;
}
3.1.2 字符宏常量
除了定义宏常数外,经常还用来定义字符串,尤其路径
#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3
3.7 #运算符
eg:
#define SQR(x) printf("The square of x is %d.\n", ((x)*(x))); 如果这样使用宏:
SQR(8);
则输出为:The square of x is 64.
注意到没有,引号中的字符 x 被当作普通文本来处理,而不是被当作一个可以被替换的语言符号。
假如你确实希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转化为字符串。上面的例子改一改:
#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
再使用:SQR(8);
则输出的是:The square of 8 is 64.
3.8 ##运算符
##运算符可把两个语言符号组合成单个语言符号。
eg:
#define XNAME(n) x ## n
如果这样使用宏:
XNAME(8)
则会被展开成这样:
x8