首页 > 编程语言 >C++学习笔记

C++学习笔记

时间:2024-01-22 21:24:25浏览次数:32  
标签:代码 笔记 学习 编译 编译器 指令 C++ include

C++ 学习笔记(1)预编译、编译、链接

预编译(Preprocessing)

cppreference中:
img
GPT这么说:

C++预编译是指在编译阶段之前对代码进行的一系列预处理操作。预编译的目的是为了将代码中的预处理指令和宏展开,以及进行一些其他的预处理操作。

预处理指令包括以井号(#)开头的指令,如#include、#define、#ifdef等。这些指令在编译阶段之前会被预处理器解析和处理。预处理器会根据这些指令执行相应的操作,例如将其他文件的内容插入到当前文件中(#include指令)、定义宏(#define指令)等。

宏展开是指将代码中的宏名称替换为其对应的定义。宏是用#define指令定义的标识符,它可以代表一段代码片段或一个常量。预处理器会将代码中的宏名称替换为其对应的定义,以便在编译阶段进行处理。

除了宏展开,预编译还可以进行一些其他的操作,例如条件编译和错误处理。条件编译是指根据条件判断是否编译某段代码,可以使用#if、#ifdef、#ifndef等指令进行条件判断。错误处理是指在预编译阶段检测代码中的错误,并给出相应的错误提示。

预编译是C++编译过程中的一个重要阶段,它可以对代码进行一些必要的处理和准备工作,以便在编译阶段进行后续的操作。预编译通过对代码中的预处理指令和宏进行解析和处理,为编译器提供了更加清晰和规范的代码,提高了编译的效率和准确性。

包括#include "xxx.h"

在C++中,#include<xxx.h> 用过很多次,但也没去搞懂这句话在干啥,只知道这是在导入头文件,好像老师上课也是这么说的,今天才明白,#include到底在干什么: 找到xxx.h文件,然后将文件中的内容复制到 #include<xxx.h>的位置处

例如:
在print.txt文件存放:
img

在main.cpp中定义函数func()

img

按下Ctrl+F7, 完成编译,通过:
img

查看预处理输出文件main.i:

img

include "print.txt"文件做的就是 将print.txt文件打开,然后将其中的内容完整的复制到 该位置。

替换#define语句

最基础的用法就是, #define A B, 这样,编译器在就会将A替换成B

img

#if

if是C++中的条件编译指令,用于根据条件判断是否编译某段代码。它的语法形式如下:

#if 条件表达式
    // 需要编译的代码
#endif

条件表达式可以是一个常量表达式、宏定义、预定义宏或关系表达式。如果条件表达式的结果为真(非零),则编译器会编译#if和#endif之间的代码;如果条件表达式的结果为假(零),则编译器会忽略这段代码,不进行编译。

img

编译(Compilation)

在编译阶段,编译器会将预处理后的代码转换为汇编语言。编译器会对代码进行词法分析、语法分析和语义分析。词法分析将代码分解为基本的语法单元,例如标识符、关键字、运算符等。语法分析根据语法规则构建抽象语法树(Abstract Syntax Tree,AST),检查代码是否符合语法规范。语义分析对代码进行类型检查、符号解析等,确保代码的语义正确。

在 Visual Studio 2022中,编译项目后,项目的Debug目录下,会生成 .obj文件,被称为目标文件,包含了编译器将源代码转换为汇编语言后的结果。

img

链接(linking)

编译结束后,链接器link就登场了,它最直观的作用就是将,每个cpp文件产生的obj文件连接整合成一个可执行文件,在windows下,就是.exe文件。

图解

img

标签:代码,笔记,学习,编译,编译器,指令,C++,include
From: https://www.cnblogs.com/rufu/p/17980636

相关文章

  • Inplementation of Binary Search Tree【1月22日学习笔记】
    点击查看代码//InplementationofBinarySearchTree#include<iostream>usingnamespacestd;structbstnode{ intdata; bstnode*left; bstnode*right;};/*bstnode*root=NULL;*//*root=NULL;wrong*//*全局范围内的变量的初始化必须在声......
  • Springboot学习第二天
    今天的学习内容是如何在项目中设计统一响应接口返回值,达到统一的格式1.响应实体我们首先要定义一个公共的接口响应实体,以后所有的接口返回值,都是返回的这个公共响应实体。这样做的好处是可以统一返回值的风格,编译接口的维护。需要包含3个关键的成员变量:状态码返回信息数......
  • C++日志记录库spdlog
    镜像库https://gitee.com/yctxkj/spdlog.gitspdlog是基于C++11实现的一款纯头文件的日志管理库(git地址:https://github.com/gabime/spdlog,API说明:https://spdlog.docsforge.com/v1.x/1.quickstart/):配置特别简单,仅包含头文件即可;写日志方式简单明了;可实现自动按日期创建日志文......
  • 操作系统学习
    操作系统是什么是一种软件,提供给用户和其他上层软件方便的接口和环境!!!系统资源的管理者提供处理机(CPU)、存储器、文件、设备管理打开QQ--相关数据放入内存--进程被CPU处理--视频通话(摄像头设备)向上层提供方便易用的服务GUI(图形用户接口)比如window下拖拽......
  • 数据结构学习中测试代码
    线性表顺序表的一些基本性质//#defineprint(x) std::cout<<x<<std::endl//#defineget(x) std::cin>>x#include<iostream>#include<fstream>usingnamespacestd;#defineInitsize100#typedefstruct{ int*data; intMaxsize,leng......
  • KY85 二叉树C++
    递归判断当前节点和n的关系就好了。如果小于等于n那就是存在。#include<iostream>usingnamespacestd;intcount(inti,intn){if(i>n)return0;returncount(2*i,n)+count(2*i+1,n)+1;}intmain(){intn,m;while(cin>>m>>n){if(n==0)......
  • 学习笔记438—《赤兔之死》高考满分文章
    建安二十六年,公元221年,关羽走麦城,兵败遭擒,拒降,为孙权所害。其坐骑赤兔马为孙权赐予马忠。一日,马忠上表:赤兔马绝食数日,不久将亡。孙权大惊,急访江东名士伯喜。此人乃伯乐之后,人言其精通马语。马忠引伯喜回府,至槽间,但见赤兔马伏于地,哀嘶不止。众人不解,惟伯喜知之。伯喜遣散诸人,抚其......
  • C语言学习第三天
    一、选择语句#include<stdio.h>intmain(){intinput=0;printf("学习C语言\n");printf("你要好好学习C语言,然后好好学习数据结构吗?(1/0)/n,1--好好学习,2--不好好学习");scanf("%d",&input);//if(input==0)printf("娶个丑老婆");......
  • JAVA 学习心得1.22
    JAVA学习1:一、一些小知识1.计算机由软件硬件组成软件—平时用的app等。硬件—鼠标键盘等。2.Java之父——詹姆斯·高斯林,由SUN公司研发。3.使用需要JDK工具包,调整Java环境,PATH等。4.Java具有跨平台性,简单来说就是很多平台都能够运行和编译java语言的文件。二、一切的......
  • 数据库学习笔记(四)—— MySQL 之 事务篇
    MySQL之事务篇事务事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。事务的四大特性(ACID):A原子性:原子性是指包含事务的操作要么全部执行......