C++学习——编译的过程
编译的过程——预处理
- 引言
- 预处理
- 包含头文件
- 宏定义指令
- 条件编译
- 编译、链接
引言
C++程序编译的过程:预处理 -> 编译(优化、汇编)-> 链接
编译和链接的内容可以查阅这篇文章(点击查看)
预处理
编译预处理是指,对我们写的源代码进行预处理,生成临时文件。
预处理指令主要有以下 三种:
- 包含头文件:
#include - 宏定义:
#define(定义宏)、#undef(删除宏) - 条件编译:
#ifdef、#ifndef
包含头文件
#include包含头文件有两种方式:
#include <文件名>:直接从编译器自带的函数库目录中寻找文件。这种情况用于包含编译器自带的头文件,也叫系统文件。#include "文件名":先从自定义的目录中寻找文件,如果找不到,再从编译器自带的函数库目录中寻找。这种情况用于包含程序员自定义的头文件。
#include也包含其它的文件,如:.h、.cpp或其它的文件。#include包含文件的本质是把需要包含的文件的内容复制进来。
C++98标准后的头文件分为C标准库和C++标准库:
- C的标准库:老版本的有.h后缀;新版本没有.h的后缀,增加了字符c的前缀。例如:老版本是
<stdio.h>,新版本是<cstdio>,新老版本库中的内容是一样的。在程序中,不指定std命名空间也能使用库中的内容。 - C++的标准库:老版本的有.h后缀;新版本没有.h的后缀。例如:老版本是
<iostream.h>,新版本是<iostream>,老版本已弃用,只能用新版本。在程序中,必须指定std命名空间才能使用库中的内容。
注意:用户自定义的头文件还是用.h为后缀。
宏定义指令
- 无参数的宏:
#define 宏名 宏内容 - 有参数的宏:
#define MAX(x,y) ((x)>(y) ? (x) : (y))
编译的时候,编译器把程序中的宏名用宏内容替换,是为宏展开(宏替换)。
宏可以只有宏名,没有宏内容。
在C++中,内联函数可代替有参数的宏,效果更好。
C++中常用的宏:
- 当前源代码文件名:
__FILE__ - 当前源代码函数名:
__FUNCTION__ - 当前源代码行号:
__LINE__ - 编译的日期:
__DATE__ - 编译的时间:
__TIME__ - 编译的时间戳:
__TIMESTAMP__ - 当用C++编译程序时,宏
__cplusplus就会被定义。
可以自行打印一下宏的内容,如下:
cout << "__FILE__: " << __FILE__ << endl;
cout << "__FUNCTION__: " << __FUNCTION__ << endl;
cout << "__TIMESTAMP__: " << __TIMESTAMP__ << endl;
cout << "__cplusplus: " << __cplusplus << endl;
条件编译
最常用的两种:#ifdef、#ifndef
#ifdef 宏名程序段一
#else程序段二
#endif
含义:如果#ifdef后面的宏名已存在,则使用程序段一,否则使用程序段二。
#ifndef 宏名程序段一
#else程序段二
#endif
含义:如果#ifndef后面的宏名不存在,则使用程序段一,否则使用序段二。
什么是宏名存在?什么是不存在?
如果用#define定义宏,宏名就存在;没定义宏,宏名就不存在。宏的内容无所谓,只要有名字就行。
ifdef、ifndef、else、 endif这些是条件编译语句,与条件判断语句不是一回事。
在C++中,头文件只需要被包含一次就行了。在C/C++中,在使用预编译指令#include的时候,为了防止头文件被重复包含,有两种方式。
- 方式1:用
#ifndef指令。
#ifndef _CAR_#define _CAR_//代码内容。
#endif
- 方式2:
#pragma once指令放在文件的开头
#pargma once
#include <iostream>using namespace std:
...
#ifndef方式受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式有些编译器不支持。
#ifndef可以针对文件中的部分代码;而#pragma once只能针对整个文件。
#ifndef更加灵活,兼容性好;#pragma once操作简单,效率高。
编译、链接
点击查看这篇文章
感谢浏览,一起学习!
相关文章:
C++学习——编译的过程
编译的过程——预处理 引言预处理包含头文件宏定义指令条件编译 编译、链接 引言 C程序编译的过程:预处理 -> 编译(优化、汇编)-> 链接 编译和链接的内容可以查阅这篇文章(点击查看) 预处理 编译预处理是指&a…...
当你要改文件 但是原来的文件内容又不能丢失的时候,拷贝一份(备注原来的),然后添加后缀:.bak
当你要改文件 但是原来的文件内容又不能丢失的时候,拷贝一份(备注原来的),然后添加后缀:.bak !!!文件不要直接删除,若你以后要还原的话会找不到...
MATLAB神经网络(五)——R-CNN视觉检测
5.1 目标分类、检测与分割 在计算机视觉领域,目标分类、检测与分割是常用计数。三者的联系与区分又在哪呢?目标分类是解决图像中的物体是什么的问题;目标检测是解决图像中的物体是什么,在哪里的问题;目标分割时将目标和…...
mock.js:定义、应用场景、安装、配置、使用
前言:什么是mock.js? 作为一个前端程序员,没有mockjs你不感觉很被动吗?你不感觉你的命脉被后端那个男人掌握了吗?所以,我命由我不由天!学学mock.js吧! mock.js 是一个用于生成随机…...
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段&#…...
Transformer中的Self-Attention机制如何自然地适应于目标检测任务
Transformer中的Self-Attention机制如何自然地适应于目标检测任务: 特征图的降维与重塑 首先,Backbone(如ResNet、VGG等)会输出一个特征图,这个特征图通常具有较高的通道数、高度和宽度(例如CHWÿ…...
2411rust,1.75.0
原文 Rust团队很高兴地声明推出Rust的新版本1.75.0. 如果你rustup安装了以前版本的Rust,你可如下取1.75.0: $ rustup update stable1.75.0稳定版中的功能 async fn和特征中的返回位置impl Trait. 指针字节偏移API 原始指针(*const T和*mutT)过去主要支持,T为单位的操作.如…...
远程办公新宠:分享8款知识共享软件
远程办公模式下,知识共享软件成为了团队协作和沟通的重要工具。以下是8款备受推崇的知识共享软件: 1、HelpLook AI知识库 简介:HelpLook是一款快速搭建AI知识库的系统,具备强大功能,如快速精准的知识检索、灵活定制的…...
3.9MayBeSomeAssembly
就是先从数组里,乘4得到正确地址 32(&s3),s3是基址,32是偏移量,就是先从数组里取出数到临时寄存器,然后再在临时寄存器上加上变量,最后再把临时寄存器上的变量存到数组里,偏移量࿰…...
i春秋-签到题
练习平台地址 竞赛中心 题目描述 题目内容 点击GUESS后会有辨识细菌的选择题 全部完成后会有弹窗提示 输入nickname后提示获得flag F12检查 元素中没有发现信息 检查后发现flag在控制台中 flag flag{663a5c95-3050-4c3a-bb6e-bc4f2fb6c32e} 注意事项 flag不一定要在元素中找&a…...
TypeScript 中扩展现有模块的用法
declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上,添加新的功能(比如扩展接口、添加类型声明等)。通过 declare module,可以将额外的声明合并到原模块中。以下是用法详解: 用…...
【报错记录】解决Termux中pulseaudio启动报错,报:E: [pulseaudio] main.c: Daemon startup failed.
前言 在尝试使用Termux-X11启动Minecraft过程中,不知道怎么回事原本好好的pulseaudio居然无法启动了,一直在报: E: [pulseaudio] main.c: Daemon startup failed. 重装了好几次也没用解决方案如下。 排除重复启动 如果pulseaudio之前已经…...
Java list
在 Java 中,链表(LinkedList)是一个非常重要的数据结构,它可以动态地插入和删除元素,因此比数组更灵活。Java 提供了 LinkedList 类,该类实现了 List 接口,并且是基于双向链表实现的,…...
MAC借助终端上传jar包到云服务器
前提:保证工程本地已打包完成:图中路径即为项目的target目录下已准备好的jar包 第一步:打开终端(先不要连接自己的服务器),输入下面的上传命令: scp /path/to/local/app.jar username192.168.1…...
对原jar包解压后修改原class文件后重新打包为jar
文章目录 背景三种修改方式1.POM中移除原jar中依赖的历史版本2.原jar它不使用pom依赖而是直接放在源码中再编译使用JarEditor 插件对源码进行修改(推荐)使用java-decompiler反编译后修改源码覆盖原class(不好用-不推荐直接跳过)提醒 参考资料-推荐阅读拓…...
YY币支付系统改源码(改良版本)
Nginx :1.20.1(版本都可以) MySQL:5.6.50(兼容该版本其他不知道) 简单优化服务器(可不安装,看要求) PHP安装扩展名称:fileinfo | opcache | imagemagick …...
【Swift】类型标注、类型安全和类型推断
文章目录 类型标注类型安全和类型推断什么是类型安全和类型推断为什么说Swift是一门安全语言类型安全带来的好处 类型标注 当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类…...
06 —— Webpack优化—压缩过程
css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…...
uniapp页面样式和布局和nvue教程详解
uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px,一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准,750rpx恰好为屏幕宽度。屏幕变宽,rpx 实际显示效果会等比放大…...
单条推理转批量推理prompt
为了将单条推理程序改为批量推理程序,并实现您的要求,我们需要进行以下步骤: 输入的图片和视频都是随机从视频文件夹、图片文件夹挑选,组成输入对: 需要编写一个函数来读取指定文件夹中的所有图片和视频文件。 使用随…...
企业知识产权管理痛点与解决方案系列解说四
知识产权管理人员在对申请的知识产权文件资料进行管理时,每次收到专利局发来的官文通知书数据包,都需要手动解压,判别状态后再上传至对应的管理系统中,完成后续的案件管理任务。在专利案件量比较大时,逐一修改案件状态…...
告别30秒等待!优化C# BLE设备搜索,Win10下3秒快速发现蓝牙锁(附核心代码对比)
告别30秒等待!优化C# BLE设备搜索,Win10下3秒快速发现蓝牙锁(附核心代码对比) 在物联网设备快速普及的今天,低功耗蓝牙(BLE)技术因其低能耗、低成本的特点,成为智能锁、可穿戴设备等…...
如何在3分钟内免费解锁城通网盘的全速下载能力?
如何在3分钟内免费解锁城通网盘的全速下载能力? 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经面对城通网盘上珍贵的资源,却因为几十KB/s的下载速度而望而却步&#…...
5分钟掌握Windows窗口置顶神器:PinWin完整使用指南
5分钟掌握Windows窗口置顶神器:PinWin完整使用指南 【免费下载链接】PinWin Pin any window to be always on top of the screen 项目地址: https://gitcode.com/gh_mirrors/pin/PinWin Windows窗口置顶工具PinWin是一款让你彻底告别频繁窗口切换的神器。无论…...
JDspyder:京东自动化抢购解决方案的技术实现与实战指南
JDspyder:京东自动化抢购解决方案的技术实现与实战指南 【免费下载链接】JDspyder 京东预约&抢购脚本,可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 在电商秒杀和限量商品抢购的激烈竞争中,技术手段…...
构建具备上下文感知的智能对话机器人:从记忆管理到主动服务
1. 项目概述:一个能“悬浮”的智能对话机器人最近在GitHub上看到一个挺有意思的项目,叫goncharenko/hoverbot-chatbot。光看名字,hoverbot就挺抓人眼球的,直译过来是“悬浮机器人”,这不禁让人好奇,一个聊天…...
新人如何快速融入技术团队?这5个细节决定你的第一印象
对于软件测试工程师而言,加入一个新的技术团队,挑战远不止于记住人名和门禁密码。你将面对的是一套陌生的系统架构、一份可能长达数百页的需求文档、一个仍在迭代中的自动化测试框架,以及一群拥有不同技术背景和沟通风格的开发伙伴。在这样的…...
仅限首批GA客户开放!Gemini Advanced for Workspace隐藏API接口曝光(含/alpha/v2beta1/insights endpoints调用凭证获取路径)
更多请点击: https://intelliparadigm.com 第一章:Gemini Advanced for Workspace隐藏API的GA权限边界与合规性初探 Gemini Advanced for Workspace(GAWS)虽未正式开放全部后端接口文档,但通过网络流量分析与OAuth 2.…...
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上我们公司因为数据安全要求,所有文档不能传到外部API。但团队又想用AI辅助写代码、做文档分析。解决方案:本地部署DeepSeek。这篇文章记录了完整的部署过程、踩过的坑、以及部署之…...
工业控制、通信设备、医疗仪器:MX30LF2G18AC-TI的嵌入式存储应用版图
MX30LF2G18AC-TI:2Gb SLC NAND闪存的工业级存储方案在工业控制、嵌入式系统以及通信设备等领域,非易失性存储器的选择直接影响设备的数据完整性、运行稳定性及长期供货保障。MX30LF2G18AC-TI是旺宏电子推出的一款2Gb SLC NAND闪存芯片,采用成…...
