C 预处理器语言注意点

C 预处理器语言注意点

**iOS 中用到的预处理器语言: **

  • 预处理器指令(头文件包含、条件编译、诊断、#pragram 指令)
  • 宏展开 (MACRO)

头文件常规注意点:
  • 使用 "" 和 <> 引用头文件的区别:
    • 前者编译器会先在存储源文件的目录中搜索该头文件。如果没找到则会去默认目录中搜索。(默认目录: 预先设置用于搜索系统标准头文件的目录)
    • 后者是只会去默认目录中搜索。
  • #import 相对于 #include 而言,可以确保头文件仅在源文件中被包含一次(防止递归包含)。

诊断常规使用:
  • 主要是配合条件编译使用。
    #ifdef FREE
    #define CHLog(x) NSLog(@"%@",x)
    #warning "define MARCO FREE"
    #else
    #define CHLog(x)
    #error "Release not define MACRO FREE"
    #endif

例子说明: FREE 是在 debug 下定义的宏,没有在 release 下定义。#warning 警告 debug 下定义了 FREE , #error 在 release 下判断是否定义了 FREE 。


宏定义常规注意点:
  • 使用 #undef 可以结束之前定义的宏
  • 宏定义容许嵌套
  • 宏定义不分配内存
  • 字符串 ("") 中永远不包含宏
  • 使用反斜杠 \ 换行
定义带参宏语法:
  1. 一般带参宏:

    #define CHMax(a,b) a>b ? a : b

  2. 使用 # 带参宏:
    # 用于把宏定义中的参数变为 C 字符串(#@ 用于将参数变为 C 字符)
    #define CHStr(str) #str
    NSLog(@"%s",CHStr(123)); -> NSLog(@"%s","123");

  3. 使用 ## 带参宏:
    相当于一个连接符号
    #define CHName(name) [self iMock_##name]
    [self CHName(log)]; -> [self iMock_log]

  4. 使用可变参数宏 _VA_ARGS_ :
    如果我们想对打印语句进行条件编译,不使用 __VA_ARGS__你会发现我们要写两个打印语句(NSLog() 参数可变):
    #define CHLog1(x) NSLog(x)
    #define CHLog2(a , b) NSLog(a , b)
    我们使用可变参数宏(可以简单的理解为用 ... 替换 __VA_ARGS__):
    #define CHLog3(...) NSLog(__VA_ARGS__)
    还可以使用(如果可变参数传空,## 会帮你把实际调用语句中用于参数分隔的逗号去掉):
    #define CHLog4(a , ...) NSLog(a , ##__VA_ARGS__)

  5. 推荐的调试打印写法(个人喜好):
    #ifdef DEBUG
    #define CHLog(fmt, ...) NSLog((@"\nFUNC: %s ---- [Line %d] \n" fmt),__func__, __LINE__, ##__VA_ARGS__)
    #else
    #define CHLog(fmt, ...)
    #endif


#pragma特殊使用:
#pragma clang diagnostic push   
#pragma clang diagnostic ignored "-Wunused-variable"
int a;  
#pragma clang diagnostic pop

例子说明: 我们申明一个未使用变量 a ,这时候编译器会给出一个警告(unused variable 'a')。我们可以使用上述命令来过滤掉这条不必要的警告。 ignored 后参数格式:-W 加上所报警告。


感谢:
C 语言三种预处理功能
Clang Compiler User's Manual
C语言 ## VA_ARGS

posted @ 2017-03-09 18:51  上水的花  阅读(210)  评论(0)    收藏  举报