首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

宏和预处理器详述

宏和预处理器详述

宏和预处理器详述
2011-09-03 15:43:31
  Macro(宏)来源于希腊语,意思就是大,远.在计算机科学中指的是规则,这个规则指定了输入和输出之间的关系(是不是优点类似于函数?).所有的宏都是一个概念,那就是输入与输出之间的映射关系,这个和函数本质上是相同的.但是宏和函数处理方式基本上是不同的,比如在C语言中,宏是在preprocess阶段被替换掉,而函数(讨论一般意义上的函数,不讨论inline函数)在运行时调入栈中运行.而且不同的语言对宏的处理也是不同的,比如C语言中,宏是无法区分作用域的(编译单元内的作用域),但是在metapost中,恰恰是可以在宏体里定义局部变量的.
  参看:http://en.wikipedia.org/wiki/Macro_%28computer_science%29
  
  下面讨论C语言中的宏.
  谈到宏,不得不提到preprocess directives(预处理指令).预处理指令是预处理器在预处理阶段所要执行的操作.具体在宏中就是执行宏替换功能.基本的一个就是#define.
  
  好,现在先谈谈宏的定义.
  宏就是处理输入和输出的规则.所以更直观的一点就是带个输入参数.

#define ADD(foo)  foo+10
  这样就定义了一个宏add,它的输入是foo,输出是foo+10,规则就是输入加上10.那么在预处理阶段是如何处理的呢?比如
bar.c

#define ADD(foo) foo+10

int main()
{

ADD(3);

return 0;
}

  这个程序在预处理阶段会被替换成:
int main()
{

3+10;

return 0;
}

  可以查阅相关的编译器手册,指定相应的选项(options),来察看这个结果.在GCC中,使用-E选项(其中会输出一些额外的信息,现在不必理会).这个宏,可以带参数,形式上和函数很像,所以有的人会称它为宏函数,这是个非正式称呼.


更常见的定义宏的方式就是没有输入(即没有参数),比如,
#define PI 3.14

  定义了宏PI, 没有输入,输出为3.14,规则就是得到3.14.处理方式同上.形式上,和常量很相像,所以又有了宏常量的称呼.


  #define FREEBSD
  定义了宏FREEBSD,这个宏没有输入,没有输出,没有规则,仅仅是定义了这个宏.
  
  但是请记住,宏和函数,在功能上是一样的,都是处理输入得到输出的过程.只不过语言或者编译器对他们的处理方式不一样.  
C语言中,一些内置的宏:
  这些内置的宏,不需要自己再define了,直接拿来用就可以.
__LINE__   表示当前行号.
__FILE__   表示编译单元的文件名
__DATE__   表示编译时的日期字符串
__TIME__   表示编译时的时间字符串
__STDC__   是否是符合标准,如果是结果为1,否则为0,这个主要是针对编译器编译时的选项.
更多的宏参考在线文档http://gcc.gnu.org/onlinedocs/gc ... d-Predefined-Macros

  注意,很多人在调试的时候使用__FUNCTION__(gcc扩展)或者__func__(C99标准),这两个都
  不是宏,应为在预处理阶段根本无法确认函数.
继承事业,薪火相传
返回列表