C++程序编译的过程:预处理-》编译(优化、汇编)-》链接
预处理指令主要有三种:
#include
#define (定义宏)、#undef (删除宏)
#ifdef #ifndef
#include
包含头文件有两种方式:
#include<文件名>
:直接从编译器自带的函数库目录中寻找文件#include"文件名"
:先从自定义的目录中寻找文件,如果找不到,再从编译器自带的函数库目录#define 宏名 宏内容
#define MAX(x,y) ((x)>(y)?(x):(y))
编译的时候,编译器把程序中的宏名用宏内容替换,称为宏展开
宏可以只有宏名,没有宏内容
C++常用宏:
__FILE__
__FUNCTION__
__LINE__
__DATE__
__TIME__
__TIMESTAMP__
__cplusplus
最常用的两种:#iddef #ifndef
如果宏名存在,使用程序段一,不存在使用程序段二
#ifdef 宏名
程序段一
#else
程序段二
#endif
如果宏名不存在,使用程序段一,不存在使用程序段二
等价于:
如果宏名存在,使用程序段二,不存在使用程序段一
#ifdnef 宏名
程序段一
#else
程序段二
#endif
#ifndef __DD
#define __DD
#endif
#pragma once
xxx
#ifndef
#pragma once
头文件.h:#include
头文件、函数的声明、结构体的声明、类的声明、模板的声明、内联函数、#define 和 const 定义的常量等
源文件.cpp:函数的定义、类的定义、模板具体化的定义
主程序 main:主程序负责实现框架和核心流程,把需要用到的头文件用#include
包含进来
将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化和汇编后,编译成若干个目标文
件(二进制文件)。
将编译好的目标文件以及他们所需要的库文件链接在一起,形成一个整体
*.cpp
文件的时候,必须要让编译器知道名称的存在,否则会出现找不到标识符的错误(直接或者间接包含头文件都可以)*.cpp
文件的时候,编译器只需知道名称的存在,不会其定义一起编译*.h
文件中,*.h
会被多次包含,链接前可能存在多个副本;如果放在*.cpp
文件中,*.cpp
文件不会被包含,只会被编译一次,链接前只存在一个版本)*.h
中是不规范的做法,如果*.h
被多个*.cpp
包含,会出现重定义#include
包含*.cpp
也是不规范的做法,原理同上*.h
文件中声明(extern
关键字),在*.cpp
文件中定义*.h
文件重复包含的处理方法只对单个的*.cpp
文件有效,不是整个项目。*.h
文件中;函数模板和类模板的具体化版本的代码是真实的定义,所以放在*.cpp
文件中