#defind 高级用法 总结

// #defind 的高级用法 总结

1 #define 实现的一些原理 编译过程 怎么处理的

/*
程序第一步是在预编译之前会有一些操作, 例如删除反斜线和换行符的组合, 将每个注释用一个空格替代…,
然后在进入预编译的时候, 会寻找可能存在的预处理指定(由#开头), 例如C中常用的#include, 或者oc中的#import, #define…很多(条件编译语句…)
处理#define的时候,然后预处理器会从#开始, 一直到执行到第一个换行符(写代码的时候换行的作用), 自然, #define只会允许定义一行的宏, 不过正因为上面提到的预处理之前会删除反斜线和换行符的组合, 所以可以利用反斜线定义多行宏, 在删除反斜线和换行符的组合后, 逻辑上就成了一行的宏了
宏作用在预编译时期, 其真正的效果就是代码替换, 而且是直接替换(内联函数!!!), 这个和函数有着很大的区别, 并且正因为是直接替换, 在使用的时候就会有一些的注意点了, 这个在后面会给出例子
宏可以被称为 类对象宏, 类函数宏(开篇给的几个宏中都已经囊括了这两类)
定义宏的语法很简单, 一个宏定义由三部分组成 , 三分部之间用空格分开, #define, 宏的名字, 主体 例如第一个宏#define PI(宏的名字) 3.14(主体), 这里有个注意点就是, 宏的命名和普通的变量命名规则相同
宏在预处理阶段只进行文本的替换(相当于把代码拷贝粘贴), 不会进行具体的计算(发生在编译时期)

*/

2

//( )中可以写变量
// #运算符被用于利用宏参数创建字符串

#define log(x) printf("this is test: x = %d", x)
#define log(x) printf("this is test: "#x" = %d", x)

3

// …和VA_ARGS 这两个是用来定义可变参数宏的, 可以看到是很简单的, 唯一一个注意点就是, …要放在参数的最后

#define print(...) printf(__VA_ARGS__)

4
// 高级用法

#  define中的三个特殊符号:#,##,#@   分别表示  1专为字符串其实就是加上双引号  2 链接  3 加上单引号#@x = 'X';

   #define Conn(x,y) x##y
   #define ToChar(x) #@x
   #define ToString(x) #x

5

/*

 另外,ANSI C标准中有几个标准预定义宏,前面几个(func...STDC)常用于printf(sprintf)等语句中:

 __func__:在源代码中插入当前所在函数名;
 __LINE__:在源代码中插入当前源代码行号;

 __FILE__:在源文件中插入当前源文件名;

 __DATE__:在源文件中插入当前的编译日期

 __TIME__:在源文件中插入当前编译时间;

 __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

 __cplusplus:当编写C++程序时该标识符被定义。

 */
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值