|
常用的预处理指令:#include #define #ifdef ,#else ,#endif ,#ifndef ,#if , #elif , #line , #error,#pragma
编译程序的第一步
对程序进行预处理前,编译器会对他进行几次翻译处理 【对于程序员来说知道这些细节,非常有帮助】,编译器首先将这些源代码中出现的字符映射到源字符集 , 改过程处理多字节字符 和 一些相关的国际化的三元字符扩展
编译程序的
第二步, 编译器查找反斜杠后面紧跟换行符的的实例并删除这些实例 ,接着 将注释由空格符替换掉 。
几个相关命令的介绍
明显常量 #define
该指令的长度, 仅限于一行 ,当然可以扩展物理行 , 这些在预处理前,会被转化成逻辑行 ;如下所示:
#define XANDERNAME "YIHUI\
IS A HERO"
#define NUM 2
每个#define行 由三部分构成 , 第一个就是 define 命令 , 第二个 是缩略语 ,也就是常说的 宏,宏的名字中不允许有空格,必须遵循C变量命名规则 。 第三部分 称谓替换列表 , 也就是 替换的主体部分 。 从宏 到 把程序中的宏被替换 ,这个过程称谓 宏展开 。
注意的地方 :
#define NAME 'XANDER' 与 #define NAME "XANDER" 的区别 , 这种区别 就是 字符 与字符串的区别 , 字符串后面会被追加'\0' 空字符 。
在#define中使用参数
可以创建外形和作用都与函数相似的类函数宏 ,宏的参数也用圆括号括起来 ,定义方法如下:
#define SUM(X) X*X
下面一个宏说明 其使用方法:
#difine SOURCE(X) X*X;
printf("the num is , %d" , SOURCE(2)) ;
类函数宏 与 函数的选择
宏与函数的选择需要考虑程序的时间和空间情况 , 如果在程序中使用宏20次 , 宏产生内联代码 , 会把代码载入20次 ,而使用函数20次, 仅产生一次函数的拷贝 。使用宏的一个优点是 宏不考虑参数的类型 , SOURCE(x)中的x可以是INT型的也可以是float型的 。
#include指令
改指令在web程序的设计中常常用到, 在c中的用法跟那差不多 , 就是载入 你要包含的代码文件 ,像是你手动把代码键入到你要载入的文件里面一样 。 #include 预处理指令有两种定义形式 , #include 第二种是 #include "myfile.h", 在unix中这两种的区别是告诉预处理器在标准系统目录中寻找文件, 而 "" 则首先寻找当前目录 。
列出一些c标准预处理宏:
__DATE__ 进行预处理的日期, __FILE__代表当前源代码文件名的字符串 , __LINE__行号常量,__TIME__源文件的编译时间,格式为"hh:mm:ss"
内联函数
使用内联函数可能简化函数的调用机制 , 但也可能不起作用 ;
创建内联函数的方法是在函数声明中使用函数说明符inline, 如下:
#include
inline void call(void){
printf ("my phonenumber is 1348888888");
}
int main(void){
call();
}
编译器看到内联声明后 ,会用call的函数体去替代 main中的函数调用 ,如同你之前键入到main中一样,需要注意的地方是 ,编译器对内联函数进行优化时 , 需要知道函数体的内容 ,这意味着内联函数的定义和对该函数的调用必须在同一文件内,也就是内联函数通常具有内部链接 。 使用方法一般是在头文件中声明并定义 ,然后将该文件包含到可执行代码中去 。 |
|