宏定义是一种预处理指令。

什么是预处理指令?
在我们的文件翻译成0和1之前做的操作我们称之为预处理指令
一般情况预处理指令都是以 # 号开头的

宏定义的格式

不带参数的宏定义

  1. #define 宏名

带参数的宏定义

  1. /*
  2. #define 代表要定义一个宏
  3. SUM 宏的名称
  4. (v1, v2) 参数, 注意点, 不需要写数据类型
  5. v1+v2 用于替换的内容
  6. 宏定义并不会做任何运算, 无论是有参数还是没有参数都仅仅是在翻译成0和1之前做一个简单的"替换"
  7. 带参数的宏定义注意点
  8. 1.一般情况下建议写带参数的宏的时候, 给每个参数加上一个()
  9. 2.一般情况下建议写带参数的宏的时候, 给结果也加上一个()
  10. */
  11. #define SUM(v1, v2) v1+v2
  12. // 要求定义一个带参数的宏, 用于计算两个变量的乘积
  13. //#define CF(v1, v2) v1*v2
  14. #define CF(v1, v2) (v1)*(v2)
  15. // 要求定义一个带参数的宏, 用于计算某个数的平方
  16. //#define PF(v1) (v1)*(v1)
  17. #define PF(v1) ((v1)*(v1))

条件编译

  1. #define DEBUG 1 // 0是调试阶段 1是发布阶段
  2. #if DEBUG == 0
  3. // 调试阶段
  4. #define NJLog(format, ...) printf(format,## __VA_ARGS__)
  5. #else
  6. // 发布阶段
  7. #define NJLog(format, ...)
  8. #endif

示例:

  1. #if DEBUG == 0
  2. char *name = "lnj";
  3. char *pwd = "123";
  4. #else
  5. char *name = NULL;
  6. char *pwd = NULL;
  7. #endif


条件编译和选则结构if的共同点
都可以对给定的条件进行判断, 添加满足或者不满足都可以执行特定的代码
条件编译和选则结构if的共区别**

  1. 生命周期不同

    if 运行时
    #if 编译之前

  2. if需要一个明确的结束符号 #endif

    为什么需要一个明确的结束符号?
    如果省略掉#endif, 那么系统就不知道条件编译的范围, 那么会将满足条件之后 的第二个条件之后的所有内容都清除

  3. if会将所有的代码都编译到二进制中

    if只会将满足条件的部分一直到下一个条件的部分 编译到二进制中

    应用场景:
    用于调试和发布阶段进行测试
    调试阶段: 程序写代码的阶段
    发布阶段: 上传到AppStore的阶段

条件编译的其他写法

  1. #include <stdio.h>
  2. #define SCORE 100
  3. //#define COUNT 50
  4. int main(int argc, const char * argv[]) {
  5. #ifdef SCORE // 判断是否定义了后面的宏
  6. printf("score\n");
  7. #elif COUNT
  8. printf("count\n");
  9. #else
  10. printf("OTHER\n");
  11. #endif
  12. #ifndef SCORE // 是不是没有定义名称叫做SCORE的宏
  13. printf("no score\n");
  14. #else
  15. printf("score\n");
  16. #endif
  17. #if defined(SCORE) // 判断是否定义了SCORE这个宏
  18. printf("score\n");
  19. #else
  20. printf("no score\n");
  21. #endif
  22. #if !defined(SCORE) // 判断是否没有定义SCORE这个宏
  23. printf("no score\n");
  24. #else
  25. printf("score\n");
  26. #endif
  27. return 0;
  28. }