您的位置:首页 > 其它

C预处理器

2016-02-06 23:28 232 查看
在对程序作预处理前编译器会对它进行翻译

明显常量define

运算符

可变宏和_ _VA_ARGS_ _

宏还是函数

include

使用头文件

在对程序作预处理前,编译器会对它进行翻译

一、编译器将源代码中出现的字符映射到源字符集。

二、编译器查找反斜线编译器会用一个空格字符代替每一个注释。

三、C实现可能还会选用单个空格代替每一个空白字符序列。(也搞不懂)

明显常量#define

预处理指令#define从#开始,到其后的第一个换行符为值。也就是说指令的长度限于一行代码,但是可以用反斜线和换行符的组合扩展到几个物理行,由这些物理行组成一个逻辑行。
#define定义的宏可以称为类对象宏


重定义常量

在XCODE下,如果对一个宏ANN定义了两次,那么ANN的值为最后定义的那个。

#define中可以使用参数

#运算符 利用宏参数创建字符串

#符号用作一个预处理运算符,它可以吧语言符号转化为字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化为相应的字符串。

#include <stdio.h>
#define PSQR(x) printf("The square of "#x" is %d.\n", ((x) * (x)))
int main(int argc, const char * argv[]) {

int y = 5;
PSQR(y);
PSQR(2 + 4);
return 0;
}

//其运行结果为
/*
The square of y is 25.
The square of 2 + 4 is 36.
Program ended with exit code: 0
*/


##运算符

##运算符可以用于类函数宏的替换部分

#include <stdio.h>
#define XNAME(n) x##n
#define PRINT_XN(n) printf("x"#n"=%d\n", x##n);
int main(int argc, const char * argv[]) {

int XNAME(1) = 14;  //变为 int x1 = 14;
int XNAME(2) = 20;  //变为 int x2 = 20;
PRINT_XN(1);        //变为printf("x1 = %d\n", x1);
PRINT_XN(2);        //变为printf("x2 = %d\n", x2);

return 0;
}
/*
运行结果如下:
x1=14
x2=20
*/


可变宏:…和_ _VA_ARGS_ _

可变宏是可以定义带可变数量参数的函数。

实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个句号)。这样,预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,以表明省略号代表什么。

#include <stdio.h>

#define PR(...) printf(__VA_ARGS__) //C语言书上这么写的
#define PR1(format,...) printf(format,##__VA_ARGS__) //传智视频上写的
#define PR2(format,...) printf(format,__VA_ARGS__)  //我试着去掉##发现也可以

int main(int argc, const char * argv[]) {

PR("%d\n", 1);
PR1("%d\n", 2);
PR2("%d\n", 3);
return 0;
}
/*
输出结果如下:
1
2
3
*/


宏还是函数

宏与函数之间的选择实际上是时间与空间的权衡。宏产生内联代码,也就是说,在程序中产生语句。如果使用宏20次,则会把20行代码插入程序中。如果使用函数20次,呢么程序中只有一份函数语句的拷贝,因此节省了空间。另一方面,程序的控制必须转移到函数中并随后返回调用程序,因此这比内联代码花费的时间更多。

#include

#include是个包含指令,有两种使用形式。

#include <> 文件名放在尖括号里,搜索系统目录

#include”” 搜索当前目录

#include”/user/biff/p.h” 搜索/user/biff目录

包含大型头文件并不一定显著增加程序的大小,很多情况下,头文件中的内容是编译器产生最终代码所需的信息,而不是加到最终代码里的具体语句。

使用头文件

头文件最常见的形式包括:

明显常量、宏函数、函数声明、结构模板定义、类型定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: