参考:https://www.learncpp.com/cpp-tutorial/
-
When you finish, you will not only know how to program in C++, you will know how NOT to program in C++, which is arguably as important.
-
Tired or unhappy programmers make mistakes, and debugging code tends to take much longer than writing it correctly 。
如何最大化学习
1.手打,自己编译,可以让你最快熟悉变异警告和错误,想每一行代码作用,不懂就去深入
2.自己改bug,学会调适
3.用例子试验。改参数看看会发生啥
4.参加测验
5.用学到的内容自己编码
介绍编程语言
机器语言。CPU可以直接读写,0,1组成,每一个0/1是比特,组成命令的比特数量可能不同,一些CPU指令长度是32位,x86可变
由于不同CPU有不同指令集,因此为一种类型的CPU程序不能移植到另一种类型的CPU
汇编语言:每一条指令有缩写表示,可以用名称和其他数字。比机器语言容易读写,但是理解较难,需要重写
才能运行在不同指令集的硬件
高级语言:为了解决可读性和移植性问题,开发了新的编程语言。
编译(C,C++,Pascal):读取源代码,生成可执行程序
解释:更灵活,效率更低。直接执行指令,无需编译成可执行文件。
(java混合使用两者)
C/C++简介:
C语言由贝尔电话实验室的Dennis Ritchie于1972年开发,主要作为一种系统编程语言(一种用于编写操作系统的语言)。
C++(发音为"see plus plus")由贝尔实验室的Bjarne Stroustrup开发,作为C语言的扩展,始于1979年。C++为C语言增加了许多新功能,它是一种面向对象的语言。
C 和 C++ 的基本设计理念可以概括为"信任程序员"------这既美妙又危险。C++旨在让程序员有高度的自由度来做他们想做的事。然而,这也意味着语言通常不会阻止你做一些没有意义的事情,因为它会假设你这样做是出于某种它不理解的原因。如果新程序员措手不及,可能会陷入很多陷阱。这就是为什么知道在C / C++中不应该做什么几乎与知道应该做什么一样重要的主要原因之一。
C++擅长什么?
C++在需要高性能和精确控制内存和其他资源的情况下表现出色。
电子游戏,实时系统,高性能金融应用(高频交易)
图形应用程序和抹零
办公应用
嵌入式软件'音频和视频处理
AI,神经网络
介绍C++开发环境
1.定义要解决的问题
2.确定如何解决问题
很多时候,程序员会得到一个想法,坐下来,然后立即开始编写解决方案。这通常会生成属于不良类别的解决方案。
通常,良好的解决方案具有以下特征:straightforward,welldocumented,模块化构建,鲁棒性,意外情况时提供有用信息
当您坐下来立即开始编码时,您通常会想"我想做",因此您可以实施最快实现目标的解决方案。这可能导致程序脆弱,以后难以更改或扩展,或者存在大量错误(技术缺陷)。
研究表明,程序员实际上只有20%的时间花在编写初始程序上。另外 80% 用于维护,包括调试(删除错误)、应对环境变化的更新(例如,在新操作系统版本上运行)、增强(提高可用性或功能的微小更改)或内部改进(提高可靠性或可维护性)。
因此,值得你花一点额外的时间(在你开始编码之前)思考解决问题的最佳方法,你正在做出什么假设,以及你如何计划未来,以便为自己节省大量的时间和麻烦。
3.编写程序
4.编译源代码
检查代码是否遵循C++语法规则,将C+源码转换为机器语言文件name.ojb
5.链接对象文件和库
获取编译器生成的所有文件,并将它们组合在单个可执行程序中。
除了能链接对象文件外,链接器还能链接库文件。(预编译代码集合,被打包以便其他程序重用)
C++核心语言实际上相当小而简洁(您将在这些教程中学到很多内容)。但是,C++还附带了一个称为C++标准库(通常缩写为标准库)的广泛库,该库提供了可在程序中使用的其他功能。C++标准库中最常用的部分之一是 iostream 库,它包含用于在显示器上打印文本和从用户获取键盘输入的功能。几乎每个编写C++程序都以某种形式使用标准库,因此标准库链接到您的程序中是很常见的。大多数链接器会在您使用标准库的任何部分后立即自动链接,
第三,,链接器确保正确解析所有跨文件依赖项。例如,如果在一个.cpp文件中定义某些内容,然后在另一个.cpp文件中使用它,则链接器会将两者连接在一起。如果链接器无法将引用连接到具有其定义的某些内容,则会收到链接器错误,并且链接过程将中止。
链接器完成链接所有对象文件和库后(假设一切顺利),您将拥有一个可执行文件,然后可以运行该文件!
链接库
链接库(Library)是预先编译好的可重用代码的集合,可以通过链接到应用程序中来实现功能的共享和重用。链接库通常包含函数、类、数据结构等代码和数据资源,通过将其与应用程序进行链接,可以在应用程序中调用这些库中提供的功能。
链接库有两种主要类型:静态链接库和动态链接库。
静态链接库(Static Library):
静态链接库在编译时被链接到应用程序中,形成一个独立的可执行文件。这意味着应用程序会包含链接库的所有代码和数据,使得应用程序能够独立运行。
使用静态链接库的优点是简单、方便,无需额外的运行时环境依赖。但缺点是每个使用该库的应用程序都会复制一份库的代码和数据,造成代码冗余和文件占用空间增加。
动态链接库(Dynamic Link Library,DLL):
动态链接库在运行时被加载到内存中,多个应用程序可以共享同一个动态链接库的实例。这意味着不同的应用程序可以共享同一个库,从而减少了内存开销和磁盘空间。
使用动态链接库的优点是节省内存和磁盘空间,同时可以通过更新动态链接库来修复和改进库中的功能。但缺点是应用程序在运行时需要依赖相应的动态链接库文件,如果缺少或版本不匹配会导致运行错误。
链接库广泛应用于软件开发中,可以提供各种功能和服务,例如数据库操作、图形界面、网络通信等。常见的链接库包括标准库(如C++标准库、C标准库)、第三方库(如OpenCV、Boost)、操作系统提供的库(如Windows API)等。
要在项目中使用链接库,通常需要将库文件与应用程序进行链接,并在代码中引用相应的头文件来访问库中的函数和数据结构。具体的链接方法和引用方式取决于开发环境和编程语言。
6.Testing 测试
7.Debugging 调试
IDE介绍
Integrated development environments (IDEs)
visual studio (选择C++桌面开发,了Windows 10 SDK(或Windows 11 SDK))
Code::Blocks (for Linux or Windows)
Blocks。Code::Blocks是一个免费的,开源的,跨平台的IDE,可以在Linux和Windows上运行。
某些 Linux 安装可能缺少使用 Code::Block 运行或编译程序所需的依赖项。:sudo apt-get install build-essential.
Visual Studio Code
是经验丰富的开发人员的热门选择,因为它快速,灵活,开源,适用于多种编程语言,并且可用于许多不同的平台。缺点是VS Code比此列表中的其他选项更难正确配置(在Windows上,也更难安装)。
编译第一个程序program
Projects 项目:
通常从一个项目开始,每个项目project对应一个程序program
控制台项目:
控制台项目意味着我们将创建可以从Windows,Linux或Mac控制台运行的程序。
默认情况下,控制台应用程序没有图形用户界面 (GUI),它们将文本打印到控制台,从键盘读取输入,并编译为独立的可执行文件。
IDE 中的编译、生成、重新生成、清理和运行/启动选项之间有什么区别?
编译代码文件时,IDE 可能会缓存生成的对象文件。这样,如果将来再次编译程序,则不需要重新编译任何未修改的代码文件 - 可以重用上次缓存的对象文件。这可以显著加快编译时间(以一点磁盘空间为代价)。
Build :生成编译项目或工作区/解决方案中所有已修改的代码文件,然后将目标文件链接到可执行文件中。如果自上次生成以来未修改任何代码文件,则此选项不执行任何操作。
Clean:删除所有缓存的对象和可执行文件,以便下次生成项目时,将重新编译所有文件并生成新的可执行文件。
Rebuild :clean+build
Compile:重新编译单个代码文件(无论它以前是否已缓存)。此选项不会调用链接器或生成可执行文件。
Run/start :执行上一次build生成的可执行文件。一些IDE会(比如Visual Studio)在run之前build确保运行的是代码最新版本
一些常见的C++问题
一般运行时问题
- 执行程序时,控制台窗口闪烁,然后立即关闭
首先,添加或确保以下行靠近程序的顶部(Visual Studio 用户,请确保这些行出现在"pch.h"或 #include"stdafx.h"#include 之后,如果存在):
c++
#include <iostream>
#include <limits>
其次,在 main() 函数的末尾添加以下代码(在 return 语句之前):
c++
std::cin.clear(); // reset any error flags
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore any characters in the input buffer until we find an enter character
std::cin.get(); // get one more char from the user
这将导致程序等待用户按某个键,然后再继续,这将使您有时间在操作系统关闭控制台窗口之前检查程序的输出。
-
我运行了我的程序并得到了一个窗口,但没有输出。
您的病毒扫描程序或反恶意软件可能会阻止执行。尝试暂时禁用它,看看这是否是问题所在。
-
我的程序可以编译,但无法正常工作。我该怎么办?
调试它
一般编译时问题
-
编译程序时,收到有关未解析的外部符号_main或_WinMain@16的错误
这意味着你的编译器找不到你的 main() 函数。所有程序都必须包含 main() 函数。
-
我正在尝试使用 C++11/14/17/XX 功能,但它不起作用
如果您的编译器较旧,则它可能不支持该语言的这些最新添加功能。在这种情况下,请升级编译器。
-
当尝试使用 cin、cout 或 endl 时,编译器会说 cin、cout 或 endl 是"未声明的标识符"
请确保在文件顶部附近包含以下行:
cpp
#include <iostream>
其次,确保每次使用 cin、cout 和 endl 都以"std::"为前缀。
cpp
std::cout << "Hello world!" << std::endl;
如果这不能解决您的问题,则可能是您的编译器已过期,或者安装已损坏。尝试重新安装和/或升级到最新版本的编译器。
-
当尝试使用 endl 结束打印的行时,编译器说 end1 是"未声明的标识符"
确保不要将endl中的字母l(小写L)误认为数字1。endl都是字母。确保您的编辑器使用的字体清楚地表明字母小写 L、大写 i 和数字 1 之间的差异。此外,在许多非编程字体中,字母大写字母 o 和数字零很容易混淆。
-
编译程序时,出现"文件末尾没有换行符"错误
C++ 标准要求所有源 (.cpp) 文件都以换行符结尾。
C++ 标准要求所有源 (.cpp) 文件都以换行符结尾
- c:\vcprojects\test.cpp(263) :fatal error C1010: unexpected end of file while looking for precompiled header directive
当 Microsoft Visual C++ 编译器设置为使用预编译标头,但C++代码文件中的一个(或多个)未 #include"stdafx.h"或 #include"pch.h"作为代码文件的第一行时,会发生此错误。我们建议的解决方法是关闭预编译标头
- "1MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)"
您可能已经创建了 Windows 图形应用程序,而不是控制台应用程序。重新创建项目,并确保将其创建为 Windows(或 Win32)控制台项目。
- "Cannot find or open the PDB file"
这是一个警告,而不是错误,因此它不会影响您的程序。但是,这很烦人。要修复它,请进入调试菜单 -> 选项和设置 ->符号,然后选中"Microsoft符号服务器"。
配置编译器:构建配置
生成配置(也称为生成目标)是项目设置的集合,用于确定 IDE 将如何生成项目。构建配置通常包括可执行文件的名称、IDE 将在哪些目录中查找其他代码和库文件、是保留还是删除调试信息、让编译器优化程序的程度等内容。通常,您需要将这些设置保留为其默认值,除非您有特定原因需要更改某些内容。
在 IDE 中创建新项目时,大多数 IDE 将为您设置两种不同的生成配置:发布配置和调试配置。
-
调试配置旨在帮助您调试程序,通常是编写程序时将使用的配置。此配置关闭所有优化,并包含调试信息,这使程序更大、更慢,但更易于调试。默认情况下,通常选择调试配置作为活动配置。
-
发布配置旨在在向公众发布程序时使用。此版本通常针对大小和性能进行了优化,并且不包含额外的调试信息。由于发布配置包括所有优化,因此此模式对于测试代码的性能也很有用
修改构建配置:
每当更新项目设置时,请对所有生成配置进行更改
配置编译器:编译器扩展
建议关闭编译器扩展:
编写使用编译器扩展的程序允许您编写与C++标准不兼容的程序。使用非标准扩展的程序通常不会在其他编译器(不支持这些相同的扩展)上编译,或者如果它们这样做,它们可能无法正常运行。
配置编译器:警告和错误级别
当你编写程序时,编译器将检查以确保你遵循了C++语言的规则
如果您做了一些明显违反语言规则的事情,在编译过程中,编译器将发出一个错误,提供包含错误的行号,以及一些关于预期内容与发现内容的文本。实际错误可能位于该行或前一行。识别并修复错误代码行后,可以再次尝试编译。
在其他情况下,编译器可能会发现看似错误的代码,但编译器无法确定(记住座右铭:"相信程序员")。在这种情况下,编译器可以选择发出警告。警告不会停止编译,而是向程序员发出似乎不对劲的通知。
Best practice 最佳实践:
不要让警告堆积如山。在遇到它们时解决它们(就好像它们是错误一样)。否则,有关严重问题的警告可能会在有关非严重问题的警告中丢失。
在极少数情况下,可能需要显式告诉编译器不要为相关代码行生成特定警告。
提高警告级别
默认情况下,大多数编译器只会生成有关最明显问题的警告。但是,您可以要求编译器更加自信地为它发现奇怪的事情提供警告。
1.在"解决方案资源管理器"窗口中右键单击项目名称,然后选择"属性"
2.在"项目"对话框中,首先确保"配置"字段设置为"所有配置"。
3.然后选择"C/C++ >常规"选项卡,并将"警告级别"设置为"级别 4"(/W4)
Best practice 最佳实践:
启用"将警告视为错误"。这将强制您解决导致警告的所有问题。
将"将警告视为错误"设置为"是 (/WX)"。
配置编译器:选择语言标准
有许多不同的C++版本可用(C++98、C++03、C++11、C++14、C++17、C++20、C++23 等),您的编译器如何知道要使用哪一个?通常,编译器会选择一个默认标准。通常,默认值不是最新的语言标准 - 许多默认为C++14,它缺少许多最新和最强大的功能。
如果您希望使用不同的语言标准(您可能会这样做),则必须配置 IDE/编译器才能这样做。
语言标准的代码名称:最终的语言标准以其最终确定的年份命名(例如C++17于2017年定稿)。
您应该选择哪种语言标准?
在专业环境中,通常会选择比最新标准落后一两个版本的语言标准(例如,如果 C++20 是最新版本,则表示 C++14 或 C++17)。这样做通常是为了确保编译器制造商有机会解决缺陷,以便充分理解新功能的最佳实践。在相关的情况下,这也有助于确保更好的跨平台兼容性,因为某些平台上的编译器可能无法立即提供对较新语言标准的完全支持。
若要选择语言标准,请打开项目,然后转到"项目"菜单>"(应用程序的名称)属性",然后打开"配置属性">"C/C++ > 语言"。
导出配置
每次创建新项目时都必须重新选择所有设置选项,这很麻烦。幸运的是,大多数 IDE 都提供了一种导出设置的方法。这通常是通过使用所需的设置创建新的项目模板,然后在创建新项目时选择该项目模板来完成的。
在 Visual Studio 中,此选项可通过 Project -> 导出模板获得。选择"项目模板",添加名称和可选描述(例如C++20控制台应用程序),然后单击"完成"。下次创建新项目时,您会看到此模板显示在项目模板列表中。使用此模板创建新项目后,它可能无法打开任何文件。可以通过转到"解决方案"-> <项目名称>->源文件-> <模板名称>.cpp,在"解决方案资源管理器"窗口中打开.cpp文件。
.cpp 与.h文件关系运行/启动从以前的生成执行可执行文件。某些 IDE(例如 Visual Studio)会在执行"运行"之前调用"构建",以确保您运行的是最新版本的代码
在C++中,通常使用.cpp文件和.h文件(或者.hpp文件)组合来管理代码。这种文件组织方式常被称为分离式编译。
.cpp文件包含实际的源代码实现。它包含类的方法定义、函数的具体实现等。
.h文件(或者.hpp文件)是头文件,它包含类、结构和函数的声明。头文件中通常只包含类成员函数的原型、变量的声明和必要的宏定义等。可以将头文件看作是对应源文件的接口。
基本上,.cpp文件包含了实现,而.h文件包含了声明。头文件的目的是在不暴露实现细节的情况下,向其他源文件提供访问类和函数的接口。
在编译过程中,编译器会将.cpp文件编译为目标文件,然后将多个目标文件链接在一起形成可执行文件。头文件的声明用于验证代码的正确性并确保符号解析正确。
因此,.cpp文件和.h文件之间的关系是,.cpp文件包含了具体实现,而.h文件提供了接口声明。头文件通过#include预处理指令来引入,以便在编译过程中能够访问到相应的声明。
OPENCV
配置环境
https://blog.csdn.net/ycx_ccc/article/details/123258001
报错dll找不到
https://blog.csdn.net/op_chaos/article/details/114023937