目录
C++程序编译的过程:预处理->编译(优化、汇编)->链接
预处理指令主要有以下三种
1)包含头文件:#include
2)宏定义:#define(定义宏)、#undef(删除洪)
3)条件编译:#ifdef、#ifndef
一、包含头文件
1)#include包含头文件又两种方式:
①#include<文件名>:
直接从编译器自带的函数库目录(系统头文件)中寻找文件。
②#include"文件名":
先从自定义的目录中寻找文件,如果找不到,再从编译器中寻找。
#include也包含其他的文件,如:*h、*cpp或其它的文件。
2)C++98标准后的头文件:
①C的标准库
老版本有.h后缀,新版本没有.h后缀,增加了字符的前缀,例如老版本是<stdio.h>,新版本是<cstdio>,库中内容是一样的,新老版本都可以用。在程序中,不指定std命名空间
②C++的标准库
老版本的有.h后缀,新版本没有.h后缀。例如新版本是<iostream>,老版本已经弃用,只能用新版本。在程序中,用库中的内容。
3)注意
用户自定义的头文件还是要用.h为后缀
二、宏定义
1)分类
①无参数的宏
#define 宏名 宏内容
②有参数的宏
#define MAX( x , y ) ( (x) > (y) ? (x) : (y) ) (像函数也不是函数,少用)
③注意
编译的时候,编译器把程序中的宏名用宏内容替换,是为宏展开(宏替换)。
宏可以只有宏名,没有后面的宏内容。
在C++中,内联函数可以替代有参数的宏,效果更好。
2)C++中常用的宏
(1)用于调试和日志文件
①当前源代码文件名:__FILE__
②当前源代码函数名:__FUNCTION__
③当前源代码行号:__LINE__
(2)用于软件版本信息
④编译的日期:__DATE__
⑤编译的时间:__TIME__
⑥编译的时间戳:__TIMESTAMP__
⑦当用C++编译程序时,宏_cplusplus就会被定义。(区别C和C++)
三、条件编译
是条件编译指令,不是条件判断语句
1)分类
最常用的两种:#ifdef、#ifndef if #define if not #define
①#ifdef
#ifdef 宏名
程序段一
#else
程序段二
#endif
含义:如果#ifdef后面的宏名已存在,则使用程序段一,否则使用程序段二。
②#ifndef
#ifndef 宏名
程序段一
#else
程序段二
#endif
含义:如果#ifndef后面的宏名不存在,则使用程序段一,否则使用程序段二。
四、解决头文件中代码重复包含的问题
1)分类
在C/C++中,在使用预编译指令#include的时候,为了防止头文件被重复包含,有两种方式。
①第一种
用#ifndef指令
#ifndef 宏名
#define 宏名
//代码内容
#endif
②第二种
用#pragma once指令放在文件的开头
③注意
#ifndef方式受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式有些编译器不支持。
#ifndef可以针对文件中的部分代码;而#pragma once只能针对整个文件。