关于预处理、宏和函数、编译链接的理解

1.预处理标识符

    __FILE__    //当前编译的源文件

   __LINE__    //文件当前所属行号

   __DATE__  //文件被编译日期

  __TIME__    //文件被编译时间

         #           //将其后的宏参数进行字符串化操作,简单讲就是在它引用的宏变量左右各加上一个双引号

       ##          //将其两边符合连接成一个符号

eg:#define CAT(STR1,STR2)\

          STR1##STR2

 

printf("%d\n",CAT(aa,bb));

 

2.宏和函数的区别

   宏是类型无关,可以频繁的用于执行简单的计算。函数不行。

    eg:  #define MALLOC(n,type) \

     ((type *)malloc((n)*sizeof(type)))

 

  int *pi=MALLOC(25,int);

  //int *pi=((int*)malloc((25)*sizeof(int)));

区别:(1)每使用一次,宏代码就插入到程序中一次,代码长度将增加;函数中代码只出现在一个地方,使用时,调用即可。

(2)宏的执行速度更快;函数存在函数调用/返回的额外开销。

(3)宏中邻近的操作符优先级会产生不可预料的结果。加do{}while(0);函数表达式求值结果更容易预测。

(4)参数每次用于宏定义时,都将重新进行求值,参数的副作用会带来不可预料的结果。函数参数则只在被调用时求一次值。

(5)宏与类型无关,函数的参数是与类型有关的。

3.编译链接的整个过程及每个过程

1.源文件(.c/.cpp)

2.预处理(.i):完成宏替换、头文件展开、去注释、条件编译。

3.编译(.s):生成汇编代码。

4.汇编(.o):将汇编指令转换为二进制。

5.链接:生成可执行程序。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值