宏定义是一种预处理指令。
什么是预处理指令?
在我们的文件翻译成0和1之前做的操作我们称之为预处理指令
一般情况预处理指令都是以 #
号开头的
宏定义的格式
不带参数的宏定义
#define 宏名 值
带参数的宏定义
/*
#define 代表要定义一个宏
SUM 宏的名称
(v1, v2) 参数, 注意点, 不需要写数据类型
v1+v2 用于替换的内容
宏定义并不会做任何运算, 无论是有参数还是没有参数都仅仅是在翻译成0和1之前做一个简单的"替换"
带参数的宏定义注意点
1.一般情况下建议写带参数的宏的时候, 给每个参数加上一个()
2.一般情况下建议写带参数的宏的时候, 给结果也加上一个()
*/
#define SUM(v1, v2) v1+v2
// 要求定义一个带参数的宏, 用于计算两个变量的乘积
//#define CF(v1, v2) v1*v2
#define CF(v1, v2) (v1)*(v2)
// 要求定义一个带参数的宏, 用于计算某个数的平方
//#define PF(v1) (v1)*(v1)
#define PF(v1) ((v1)*(v1))
条件编译
#define DEBUG 1 // 0是调试阶段 1是发布阶段
#if DEBUG == 0
// 调试阶段
#define NJLog(format, ...) printf(format,## __VA_ARGS__)
#else
// 发布阶段
#define NJLog(format, ...)
#endif
示例:
#if DEBUG == 0
char *name = "lnj";
char *pwd = "123";
#else
char *name = NULL;
char *pwd = NULL;
#endif
条件编译和选则结构if的共同点
都可以对给定的条件进行判断, 添加满足或者不满足都可以执行特定的代码
条件编译和选则结构if的共区别**
生命周期不同
if 运行时
#if 编译之前if需要一个明确的结束符号 #endif
为什么需要一个明确的结束符号?
如果省略掉#endif, 那么系统就不知道条件编译的范围, 那么会将满足条件之后 的第二个条件之后的所有内容都清除if会将所有的代码都编译到二进制中
if只会将满足条件的部分一直到下一个条件的部分 编译到二进制中
应用场景:
用于调试和发布阶段进行测试
调试阶段: 程序写代码的阶段
发布阶段: 上传到AppStore的阶段
条件编译的其他写法
#include <stdio.h>
#define SCORE 100
//#define COUNT 50
int main(int argc, const char * argv[]) {
#ifdef SCORE // 判断是否定义了后面的宏
printf("score\n");
#elif COUNT
printf("count\n");
#else
printf("OTHER\n");
#endif
#ifndef SCORE // 是不是没有定义名称叫做SCORE的宏
printf("no score\n");
#else
printf("score\n");
#endif
#if defined(SCORE) // 判断是否定义了SCORE这个宏
printf("score\n");
#else
printf("no score\n");
#endif
#if !defined(SCORE) // 判断是否没有定义SCORE这个宏
printf("no score\n");
#else
printf("score\n");
#endif
return 0;
}