版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/82876747
1. 宏的定义
原样替换 #define
gcc –E *.c 查看宏替换后的效果
宏函数不存在传递参数、地址等问题,是直接贴过来代码,所以速度快,缺陷就是没有类型检查等内容
#include<stdio.h>
#define P printf(
#define H “hello\n”);
int main(){
P H
return 0;
}
2. 避免重复定义宏
宏不可以重复定义,为了避免重复,一般有以下写法:
#ifdef 如果定义过
#ifdef H
#undef H //取消对H的定义
#endif
#ifndef 如果没定义过
#ifndef H
#define H “aaa”
#else
…
#endif
注意:如果在头文件中定义且导入了两次同样会认为重定义,因此有如下写法,多次导入头文件也不会出错:
#ifndef HEADER_H
#define HEADER_H 1
int x = 0;
#endif
3. C语言预先定义好的宏
C语言预先定义好的宏:双下划线开始和双下划线结束
__FILE__ //输出当前文件名
__LINE__ //输出当前行号
__DATE__ //输出当前日期
__TIME__ //输出当前时间
4. 宏定义——带参数
#include <stdio.h>
#define SWAP(T, x, y) {T t=x; x=y; y=t;}
int main(){
int a=10, b=20;
SWAP(int, a, b);
return 0;
}
#include <stdio.h>
#define MAX(x, y) x > y ? x:y
#define PI 3.1415926
#define AREA(r) PI*r*r
int main(){
int a=10, b=20;
printf("%d\n", MAX(a, b));
printf("%g\n", AREA(10) );
getchar();
return 0;
}
4.1 如果希望写成
printf("%g\n", AREA(10+20) );
现有的写法会报错,解决办法是加括号
#include <stdio.h>
#define MAX(x, y) x > y ? x:y
#define PI 3.1415926
#define AREA(r) PI*(r)*(r)
int main(){
int a=10, b=20;
printf("%d\n", MAX(a, b));
printf("%g\n", AREA(10+20) );
getchar();
return 0;
}
4.2 如果希望写成
printf("%d\n", MAX(a, b)+ MAX(a, b));
现有的写法会报错,解决办法是加括号
#include <stdio.h>
#define MAX(x, y) ((x) > (y) ? (x):(y))
#define PI 3.1415926
#define AREA(r) PI*(r)*(r)
int main(){
int a=10, b=20;
printf("%d\n", MAX(a, b));
printf("%g\n", AREA(10) );
getchar();
return 0;
}
5. 宏定义 —— 井号
井号的作用是将参数转为字符串
#include <stdio.h>
#define STR(x) puts(#x)
int main(){
STR(hello);
getchar();
return 0;
}
6. 宏定义 —— 双井号
双井号:用来拼接标识符,可以把参数和另外一个东西拼接为标识符
#include <stdio.h>
void wellcomStudent(){printf("abc\n");}
void wellcomTsacher(){printf("def\n");}
#define wellcom(who) wellcom##who()
int main(){
wellcom(Student);
getchar();
return 0;
}