learncpp-0 简介

0 简介

0.1 课程介绍

  • 教程特点:零基础适用、示例丰富
  • 课程结构:第0章介绍c++编程的相关概念及软件;第1章介绍c++基础,后面章节深入研究;每章都有一个主题
  • 目标
    • 涵盖一般的编程主题:编程风格、常见陷阱、调试、好/坏的编程实践、测试
    • 提供大量示例(尽量不在示例中省略内容、引入未解释过的概念)
    • 提供练习题及解答
    • 享受编程的乐趣
  • 充分利用教程
    • 手敲示例并自己编译,从而熟悉常见的编译警告和错误;思考每行代码的作用
    • 自己发现并解决错误;重视debugger的学习和使用
    • 尝试修改示例程序并观察结果
    • 花时间做测验
    • 使用学到的概念编写程序
  • 遇到不懂的概念可以:读评论/浏览后续章节/使用搜索引擎/使用AI/网上提问/先跳过

0.2 编程语言简介

  • 计算机只能理解有限的命令集,并且必须被明确告知要做什么
  • 机器语言
    • cpu可以直接理解的有限指令集成为机器码/机器语言/指令集
    • 每条机器指令都是由0和1组成的序列(如10110000 01100001),每个0和1称为一个二进制位;组成单个机器指令的位数是变化的:一些cpu处理的机器指令总是32位长,而另一些cpu(如x86/x64)处理的机器指令可以是可变长度
    • 每组二进制数字都被cpu解释为一条命令,以完成一项具体的任务;然而不同cpu有不同的指令集,为某种cpu编写的指令不能在另一种cpu(不具有相同的指令集)上使用,这就意味着程序不能移植到不同类型的系统中,必须重新编写
  • 汇编语言
    • 汇编语言中,每条指令都用一个缩写词来标识,并且可以使用指令名和其他编号(如mov al, 061h)
    • cpu不能直接理解汇编语言,因此汇编程序必须先被翻译成机器语言(通过一个叫做汇编器的程序来完成的),然后才能被计算机执行;汇编程序速度很快
    • 缺点
      • 汇编程序所需指令太多,虽然单条指令可读性较好,但是理解整个程序仍然困难
      • 可移植性仍然不好,用汇编语言为一个cpu编写的程序很可能无法在使用不同指令集的硬件上运行
  • 高级语言
    • 和汇编语言一样,高级语言编写的程序在运行之前必须被翻译成计算机可以理解的格式(可以通过编译和解释两种方式实现)
    • 编译:
      • 编译器是一个程序(或程序集),它读取源代码(通常用高级语言编写)并将其翻译成其他语言(通常是低级语言,比如汇编语言或机器语言)。这些低级语言文件被合并成一个可执行文件(包含机器语言指令),可以运行或分发给其他人
      • 如果仅仅只是运行可执行文件不需要安装编译器
    • 解释:
      • 解释器也是一个程序,它直接执行源代码中的指令,不需要先将它们编译成可执行文件;这意味着解释器必须安装在每一台运行源代码的机器上
      • 解释器看上去比编译器更灵活,但是在运行程序时效率较低
    • 高级语言的优点
      • 可读性强
      • 相比低级语言,执行相同的任务时所需的指令更少
      • 可移植性强:高级语言程序可以为不同的系统编译/解释,不必为了在不同的cpu上运行而修改程序(只需要重新编译/解释)
    • 许多操作系统具有一些特定功能,可以在编写代码时使用这些特定功能;这使得为特定操作系统编写程序更加容易,但是牺牲了可移植性
    • 一些编译器也支持一些特有扩展,如果在程序中使用了这些扩展,那么就不能被其他不支持这些扩展的编译器编译

0.3 C/C++介绍

  • C++可以简单认为是C的超集(虽然C99中引入了一些C++中不存在的特性)
  • C和C++的基本设计哲学可以总结为“相信程序员”
  • C++在需要高性能和精确控制内存等资源的场景下表现出色

0.4 C++开发入门

  • 步骤1:定义想要解决的问题
  • 步骤2:确定解决问题的方案
  • 步骤3:编写程序

0.5 编译器、链接器和库

  • 步骤4:编译源码

C++编译器按顺序遍历程序中每个源码文件(.cpp),并执行两项重要任务
1.检查代码是否遵循C++语言规则,然后没有则会给出错误提示
2.将源码翻译成机器语言指令,并存储在一个称为目标文件的中间文件(.o/.obj)中(目标文件中还包含一些后续步骤中所需要的元数据)(一个.cpp文件会对应生成一个.o文件)

  • 步骤5:链接目标文件和库
  • 链接器的工作是组合所有的目标文件和库文件(C++标准库或其他第三方库),并生成可执行文件。这个过程叫做链接

首先,链接器读取编译器生成的目标文件的内容并确保它们是有效的
其次,链接器确保所有跨文件的依赖关系都被正确地解析。如果在a.cpp中定义了一个东西并且在b.cpp中使用了它,那么链接器就会将这两个.cpp文件链接在一起。如果链接器无法将一个东西的引用链接到它的定义,就会产生链接错误并终止链接过程
最后,链接器还能够链接库文件。库文件是预编译代码的集合,这些代码被打包以便在其他程序中重用

  • C++标准库是C++附带的库,提供了一组有用的功能可以在程序中使用
  • 构建通常指的是将源码文件转换成可执行文件的整个过程
  • 步骤6和7:测试和调试

0.6 安装IDE

0.7 编译第一个程序

  • 项目是一个容器,包含了所有的源码文件;构建程序时,项目中的所有.cpp文件都会被编译和链接
  • 一个项目对应一个程序,为编写的每个新程序创建一个新项目

控制台项目:可以从windows、linux、mac控制台运行的程序
控制台程序没有图形用户界面(GUI),它们将文本输出到控制台、从键盘读取输入,并编译成独立的可执行文件

  • 工作区或解决方案是可以容纳一个或多个相关项目的容器
  • IDE可能会缓存源码文件编译生成的目标文件,如果下一次编译时源码文件没有修改则可以使用缓存的目标文件

Build:编译项目中所有修改了的源码文件,并将生成的目标文件链接形成可执行文件(如果没有源码文件改动,则不做任何事)
Clean:删除所有缓存的目标文件和可执行文件
Rebuildclean+build
Compile:编译单个源码文件(不管之前是否被缓存过),不会调用链接器或生成可执行文件
Run/Start:执行构建中生成的可执行文件(有些IDE会在run之前执行build,以确保运行的是最新版本的代码)

0.8 常见C++问题

0.9 构建配置

  • debug配置:关闭所有优化、包含调试信息。开发程序时一般使用debug配置。
  • release配置:针对大小和性能做了优化(对于测试代码的性能很有用),不包含额外的调试信息。

0.10 编译器扩展

  • 编译器实现的一些特定行为称为编译器扩展。
  • 利用编译器扩展编写的程序可能无法在其他编译器上编译,因此最好关闭编译器扩展功能。

0.11 警告和错误级别

0.12 选择语言标准

  • C++语言标准文档描述了语言标准的规则和要求,它帮助编译器的开发者们准确地实现新的语言标准。
  • 程序编译失败可能的原因:
    • 编译器使用的语言标准较旧,不支持正在使用的特性
    • 编译器的版本可能缺少对新特性的支持

0.13 查看编译器使用的语言标准

posted @ 2024-07-22 22:15  dengkang1122  阅读(1)  评论(0编辑  收藏  举报