C语言中的宏

来源:互联网 发布:ubuntu查找java路径 编辑:程序博客网 时间:2024/06/06 12:39

预编译

“源代码”到“可执行文件”的过程包括四个步骤:预编译编译汇编链接。所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译阶段仅仅对源代码的单词进行变换,而不是对程序中的变量、函数等

宏定义

1. 一般在宏定义的结尾不加分号在有参数的空定义中,如果含有数值运算,那么就要在宏整体”和“宏参数”两端都要加上括号如:#define max(a, b) ((a)+(b)); 

3. 注意空格。在有参数的宏定义中,注意“宏名称”和“参数列表”之间不能有空格。如:#define max (a, b) ((a)+(b));  在"max”和”(a, b)”之间不能有空格。

4. 不要使用有副作用的参数区调用宏。常见的有副作用的参数有:a++,getchar()等。如:宏定义为#define max (a, b) ((a)+(b));那么使用max(i++, j++)调用该宏,会造成 i 或 j 中的一个值增加2,而不是我们期望的 1。

5. 可以使用编译器选项 添加宏 和 移除宏。我使用的是gcc,添加宏的指令是”-D”,移除宏的指令是”-U”。

6. 宏参数替换的时候,不会替换字符串中的字符。即不会替换双引号之间的字符,其他的都会被替换,包括单引号之间的。

7. 可以使用#将 宏参数的值 转化为字符串

8. 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数 差异,方便移植。

文件包含

为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如:
        #ifndef MY_H
        #define MY_H
          ……
        #endif

在程序中包含头文件有两种格式:
        #include <my.h>
        #include "my.h"
第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。

第二种方法是用双引号把头文件括起来。这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。

 

原创粉丝点击