《程序员面试宝典》C/C++预处理

4.5预处理
预处理其实就是预编译,主要进行代码文本的替换工作
4.5.1ifndef/define/endif的作用
如果一个项目中有三个文件A、B和C,其中A和B要同时使用C文件,因此需要在A和B中包含(include)C文件,但是在编译的时候,要对两个C文件进行操作,可能会产生大量的声明冲突,而使用#ifndef和#endif就可以解决这个问题。字面上理解就是如果没有编译过这个文件,就对这个文件进行编译。一般将下面的语句写到C文件中。

#ifndef C_H
#define C_H
C文件原始代码

#endif

4.5.2#include<>和#include””的区别
首先需要注意,标准文件库自带的头文件使用#include<>,自己定义的使用#include””。
使用#include<>,编译器会从标准库路径开始搜索头文件,使系统文件调用更快;使用#include””,编译器会先从用户工作路径搜索头文件,然后去寻找系统路径,是的自定义文件调用更快。

4.5.3define和typdef的区别
(1)原理上不同,#define是C语言中预处理指令,只是进行简单和机械的字符串替换,不做任何语法检查。末尾不使用语法分号。typedef是C/C++关键字,需要语法检查,末尾需要使用语法分号。
(2)功能上不同,typedef用来定义类型的别名,类型包括内部类型(int等)还包括自定义类型。

typedef int a[10];

a s1,s2;//相当于定义了两个整形数组,类似于char c1,c2;a也是一种类型,这是别名替换,表明a是一个整形数组(就相当于自己定义了一个字符型char一样),
(3)作用域不同,需要注意#define没有作用域,而typedef有作用域(相当于一般变量的作用域)
(4)对指针的操作不同

#define P1 int *
typedef int * P2;
P1 a1,a2;//相当于int *a1,a2,一个指针一个变量
P2 a3,a4;// 相当于int *a1,int *a2,2个指针
int a5=10;
const P1 a6 = &a5;//和const int * a6相同,常量指针,内容不能改变
const P2 a7 = &a5;//指针常量,指针不能改变
P2 const a8 = &a5; //指针常量,指针不能改变

宏替换只是简单的字符上的替换,不含意义上的替换。typedef是别名意义上的替换。P1是简单的替换,因此还是常量指针,而P2是一个指针别名。

猜你喜欢

转载自blog.csdn.net/wangshuailpp/article/details/79938865