C++编译和链接

文章目录

  • 编译预处理
    • 预处理做的事情
    • 包含头文件
    • 宏定义
    • 条件编译
    • 解决头文件重复包含问题
      • 方法一、#ifndef
      • 方法二、#pragma once
  • 编译和链接
    • 源代码的组织
    • 编译
    • 链接
    • 更多细节

编译预处理

C++程序编译的过程:预处理-》编译(优化、汇编)-》链接

预处理指令主要有三种:

  • 包含头文件:#include
  • 宏定义:#define (定义宏)、#undef (删除宏)
  • 条件编译:#ifdef #ifndef

预处理做的事情

  • 处理#include 头文件包含指令
  • 处理#ifdef #else #endif、#ifndef #else #endif 条件编译指令
  • 处理#define 宏定义
  • 为代码添加行号、文件名和函数名
  • 删除注释
  • 保留部分#pragma编译器指令(编译的时候会用到)

包含头文件

#include包含头文件有两种方式:

  • #include<文件名>:直接从编译器自带的函数库目录中寻找文件
  • #include"文件名":先从自定义的目录中寻找文件,如果找不到,再从编译器自带的函数库目录
    中寻找
    include可以包含许多类型文件,本质就是将包含的文件复制到主文件中

宏定义

  • 无参数的宏:#define 宏名 宏内容
  • 有参数的宏:#define MAX(x,y) ((x)>(y)?(x):(y))

编译的时候,编译器把程序中的宏名用宏内容替换,称为宏展开

宏可以只有宏名,没有宏内容

C++常用宏:

  • 当前源代码文件名:__FILE__
  • 当前源代码函数名:__FUNCTION__
  • 当前源代码行号:__LINE__
  • 编译的日期:__DATE__
  • 编译的时间:__TIME__
  • 编译的时间戳:__TIMESTAMP__
  • 区分gcc和g++:__cplusplus

条件编译

最常用的两种:#iddef #ifndef

如果宏名存在,使用程序段一,不存在使用程序段二

#ifdef 宏名
程序段一
#else
程序段二
#endif

如果宏名不存在,使用程序段一,不存在使用程序段二
等价于:
如果宏名存在,使用程序段二,不存在使用程序段一

#ifdnef 宏名
程序段一
#else
程序段二
#endif

解决头文件重复包含问题

方法一、#ifndef

#ifndef __DD
#define __DD#endif

方法二、#pragma once

#pragma once
xxx

#ifndef

  • 受C++语言标准支持,不受编译器的限制
  • 可以针对文件中的部分代码

#pragma once

  • 有的编译器不支持
  • 只能针对整个文件

编译和链接

源代码的组织

头文件.h#include 头文件、函数的声明、结构体的声明、类的声明、模板的声明、内联函数、#define 和 const 定义的常量等

源文件.cpp:函数的定义、类的定义、模板具体化的定义

主程序 main:主程序负责实现框架和核心流程,把需要用到的头文件用#include包含进来

在这里插入图片描述

编译

将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化和汇编后,编译成若干个目标文
件(二进制文件)。

链接

将编译好的目标文件以及他们所需要的库文件链接在一起,形成一个整体

更多细节

  1. 分开编译好处:每次只编译修改过的源文件,然后再链接,效率更高
  2. 编译单个*.cpp文件的时候,必须要让编译器知道名称的存在,否则会出现找不到标识符的错误(直接或者间接包含头文件都可以)
  3. 编译单个*.cpp文件的时候,编译器只需知道名称的存在,不会其定义一起编译
  4. 如果函数或类定义不存在,编译不会报错,但是链接会出现无法解析的外部命令
  5. 链接的时候,变量、函数和类的定义只能有一个,否则会出现重定义的错误。(如果把变量、函数和类的定义放在*.h文件中,*.h 会被多次包含,链接前可能存在多个副本;如果放在*.cpp文件中,*.cpp文件不会被包含,只会被编译一次,链接前只存在一个版本)
  6. 把变量、函数和类的定义放在*.h中是不规范的做法,如果*.h被多个*.cpp包含,会出现重定义
  7. #include包含*.cpp也是不规范的做法,原理同上
  8. 尽可能不使用全局变量,如果一定要用,要在*.h文件中声明(extern关键字),在*.cpp文件中定义
  9. 全局的const 常量在头文件中定义(const 常量仅在单个文件内有效)。
  10. *.h文件重复包含的处理方法只对单个的*.cpp文件有效,不是整个项目。
  11. 函数模板和类模板的声明和定义可以分开书写,但它们的定义并不是真实的定义,只能放在*.h文件中;函数模板和类模板的具体化版本的代码是真实的定义,所以放在*.cpp文件中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418755.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerBI Copilot 零售数据分析自动化报告实战

读了三篇powerbi copilot的文章&#xff0c;想必大家对此都有了大致的了解&#xff1a; Copilot in Power BI等了好久终于等到今天 Copilot in Power BI详细使用说明 PowerBI Copilot已全面支持中文识别 有小伙伴提出如下问题&#xff1a; 老师这个是不是还得在powerbi des…

【linux】ps的基本使用

ps是linux中用于显示进程的工具&#xff0c;确切来说是显示活动进程的工具 ps的基本格式是 ps [选项] sh-3.2# ps --help ps: illegal option -- - usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]][-g grp[,grp...]] [-u [uid,uid...]][-p pid[,pid..…

python进程间通信——命名管道(Named Pipe、FIFO)

文章目录 Python中的命名管道&#xff1a;深入理解进程间通信1. 命名管道简介2. 创建和删除命名管道3. 写入命名管道4. 读取命名管道5. 示例&#xff1a;进程间通信write_to_pipe.pyread_from_pipe.py测试运行 6. 注意事项和限制命名管道的半双工机制命名管道读写任意一方未打开…

事件驱动架构

请求驱动 服务注册&#xff0c;服务发现&#xff0c;虽然调用地址隐藏了&#xff0c;但是调用stub必须相同。 rpc通信&#xff0c;远程调用。 生产者和消费者要有相同的stub存根。 消费者和生产者的调用接口是耦合的。 事件驱动 核心&#xff1a;上下游不进行通信 中间通过M…

Vue的生命周期方法

beforeCreate 在实例初始化之后&#xff0c;数据观测&#xff08;data observe&#xff09;和 event/watcher 事件配置之前被调用。在当前阶段 data、methods、computed 以及 watch 上的数据和方法都不能被访问。 created 实例已经创建完成之后被调用。在这一步&#xff0c;实…

32 登录页组件

效果演示 实现了一个登录页面的样式&#xff0c;包括一个容器、左侧和右侧部分。左侧部分是一个背景图片&#xff0c;右侧部分是一个表单&#xff0c;包括输入框、复选框、按钮和忘记密码链接。整个页面的背景色为白色&#xff0c;容器为一个圆角矩形&#xff0c;表单为一个半透…

OB OCP工具

文章目录 OCP产品架构OCP核心功能集群管理-集群拓扑图告警管理 OCP OCP&#xff08;OceanBase Cloud Platform&#xff09;是企业级数据库管理平台OceanBase 云平台&#xff08;OceanBase Cloud Platform&#xff0c;OCP&#xff09;是以 OceanBase 为核心的企业级数据库管理平…

回溯法:N皇后问题

问题背景 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。 • 问题是&#xff1a;在88的棋盘上摆放八个皇后&#xff0c; 使其不能互相攻击&#xff0c; 即任意两个皇后都不能处于同一行、 同一列或同一斜线上。 • n皇后问题&#xff1a;即在n n的棋盘上摆放n个皇后…

第八回 柴进门招天下客 林冲棒打洪教头-Linux服务器管理软件宝塔面板介绍

花和尚鲁智深在野猪林救下了豹子头林冲&#xff0c;林冲宅心人厚&#xff0c;反而恳请鲁智深饶过薛霸与董超的性命。鲁智深劝不动林冲跟他一起逃走&#xff0c;只好一路护送至沧州附近才离开。 快到沧州时&#xff0c;林冲来到小旋风柴进府上&#xff0c;受到热情款待。柴进府…

利用HTML+CSS+JS打造炫酷时钟网页的完整指南

引言 在现代Web开发中&#xff0c;制作一个引人注目的时钟网页是一种常见而令人愉悦的体验。本文将介绍如何使用HTML、CSS和JavaScript来创建一个炫酷的时钟网页&#xff0c;通过这个项目&#xff0c;你将学到如何结合这三种前端技术&#xff0c;制作一个动态且美观的时钟效果…

Docker安装配置OnlyOffice

OnlyOffice 是一款强大的办公套件&#xff0c;你可以通过 Docker 轻松安装和部署它。本文将指导你完成安装过程。 步骤 1&#xff1a;拉取 OnlyOffice Docker 镜像 首先&#xff0c;使用以下命令从 Docker Hub 拉取 OnlyOffice Document Server 镜像&#xff1a; sudo docke…

中小企业如何快速融资-----股权融资的四种方式(上)

’在企业融资的多种手段中&#xff0c;股权质押融资、股权交易增值融资、股权增资扩股融资和股权的私募融资&#xff0c;逐渐成为中小企业利用股权实现融资的有效方式。随着市场体系和监管制度的完善&#xff0c;产权市场为投融资者搭建的交易平台日益成熟&#xff0c;越来越多…