宏定义
编译预处理指令
-
开头的是便有意与处理指令
- 他们不是C语言的成分,但是C语言程序离不开他们
-
define用来定义一个宏
#include<stdio.h>
#define PI 3.14159
int main(int argc, char const *argv[])
{
printf("%f\n", 2*PI*3.0);
return 0;
}
18.849540
#define
-
defin <名字> <值>
- 注意没有结尾的分号,因为不是C的语句
- 名字必须是一个单词,值可以是各种东西
- 在C语言的编译器开始编译开始之前,编译预处理陈旭(cpp)会把程序中的名字换成值
- 完全的文本替换
宏
- 如果一个宏的值中有其他宏的名字,也会被替换的
- 如果一个宏的值超过一行,最后一行之前的行末需要加\
- 宏的值后面出现的注释不会当做宏的值的一部分
#include<stdio.h>
#define PI 3.14159
#define FORMAT "%f\n"
#define PI2 2*PI
int main(int argc, char const *argv[])
{
printf(FORMAT, PI2*3.0);
return 0;
}
18.849540
#include<stdio.h>
#define PI 3.14159
#define FORMAT "%f\n"
#define PI2 2*PI
#define PRT printf("%f ",PI);\
printf("%f\n",PI2)
int main(int argc, char const *argv[])
{
//printf(FORMAT, PI2*3.0);
PRT;
return 0;
}
3.141590 6.283180
没有值的宏
-
define _DEBUG
- 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了
预定义的宏
__LINE__ //行号
__FILE__ //文件名
__DATE__ //编译时候的日期
__TIME__ //编译时候的时间
__STDC__
带参数的宏
像函数的宏
-
define cube(x) ((x) * (x) * (x))
- 宏可以带参数
#include<stdio.h>
#define cube(x) ((x)*(x)*(x))
int main(int argc, char const *argv[])
{
printf("%d\n", cube(5));
return 0;
}
125
错误定义的宏
-
define RADTODEG(x) (x * 57.29578)
-
define RADTODEG(x) (x) * 57.29578
#include<stdio.h>
#define RADTODEG1(x) (x * 57.29578)
#define RADTODEG2(x) (x) * 57.29578
int main(int argc, char const *argv[])
{
printf("%f\n", RADTODEG1(5+2));
printf("%f\n", 180/RADTODEG2(1));
return 0;
}
119.591560
10313.240400
带参数的宏的原则
-
一切都要括号
- 整个值要括号
- 参数出现的每个地方都要括号
-
define RADTODEG(x)((x)*57.29578)
待参数的宏
-
可以带多个参数
-
define MIN(a,b)((a) > (b) ? (b):(a))
-
-
也可以组合(嵌套)使用其他宏
-
在大型程序的代码中使用非常普遍
-
可以非常负载,如“产生”函数
- 在#和##这两个运算符的帮助下
-
存在中西方文化差异
-
部分宏会被inline函数替代
网友评论