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

来源:互联网 发布:商业数据分析 编辑:程序博客网 时间:2024/05/21 15:45

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.链接:生成可执行程序。

 

 

 

0 0
原创粉丝点击