宏定义是一种预处理指令。
什么是预处理指令?
在我们的文件翻译成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 == 0char *name = "lnj";char *pwd = "123";#elsechar *name = NULL;char *pwd = NULL;#endif
条件编译和选则结构if的共同点
都可以对给定的条件进行判断, 添加满足或者不满足都可以执行特定的代码
条件编译和选则结构if的共区别**
生命周期不同
if 运行时
#if 编译之前if需要一个明确的结束符号 #endif
为什么需要一个明确的结束符号?
如果省略掉#endif, 那么系统就不知道条件编译的范围, 那么会将满足条件之后 的第二个条件之后的所有内容都清除if会将所有的代码都编译到二进制中
if只会将满足条件的部分一直到下一个条件的部分 编译到二进制中
应用场景:
用于调试和发布阶段进行测试
调试阶段: 程序写代码的阶段
发布阶段: 上传到AppStore的阶段
条件编译的其他写法
#include <stdio.h>#define SCORE 100//#define COUNT 50int main(int argc, const char * argv[]) {#ifdef SCORE // 判断是否定义了后面的宏printf("score\n");#elif COUNTprintf("count\n");#elseprintf("OTHER\n");#endif#ifndef SCORE // 是不是没有定义名称叫做SCORE的宏printf("no score\n");#elseprintf("score\n");#endif#if defined(SCORE) // 判断是否定义了SCORE这个宏printf("score\n");#elseprintf("no score\n");#endif#if !defined(SCORE) // 判断是否没有定义SCORE这个宏printf("no score\n");#elseprintf("score\n");#endifreturn 0;}
