C++函数后面的throw()

为了在异常处理的时候不引发新的异常,导致死循环
该函数不抛出任何异常
内部实现是需要人肉确保
如果一个标明throw()的函数内部发生了throw:
1,如果内部直接throw something,编译器会发现并指出;
2. 如果是内部调用了一个可能throw something的函数,编译器无法发现,运行时一旦这个内部的函数throw,程序会abort。

这是异常规范,只会出现在声明函数中,表示这个函数可能抛出任何类型的异常,例如:
void GetTag() throw(int);表示只抛出int类型异常
如果抛出非int异常,调用unexsetpion()函数,退出程序
void GetTag() throw(int,char);表示抛出in,char类型异常
void GetTag() throw();表示不会抛出任何类型异常
void GetTag() throw(…);表示抛出任何类型异常
还需要注意的是。如果,我们函数已经标明为 throw()
那么你 try{}catch(…) 是不起作用的,程序直接 abort。
原文链接:https://blog.csdn.net/jxhgh/article/details/19038793

C++abort()函数与exit()函数区别

exit和abort都是用来终止程序的函数,他们的不同如下:
exit会做一些释放工作:
释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序。如果有函数通过atexit来注册,还会调用注册的函数。不过,如果atexit函数扔出异常的话,就会直接调用terminate。
补充一下,如果是用c++的话,exit调用的时候,对象还是不会被正确析构的,所以在exit前一定要释放应该释放的资源,特别内核驻留的像共享内存之类。
abort:立刻terminate程序,没有任何清理工作。
原文链接:https://blog.csdn.net/cnd2449294059/article/details/73203159

预处理器

预处理器是一些指令,指示编译器在编译之前所需完成的预处理。
预处理器的主要作用就是: 把通过预处理的内建功能对一个资源进行等价替换
最常见的预处理有: 文件包含,条件编译、布局控制和宏替换4种。
文件包含: #include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文。
条件编译: #if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。
布局控制: #progma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。
宏替换: #define,这是最常见的用法,它可以定义符号常量、函数功能、重新命名、字符串的拼接等各种功能。

所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。

原文链接:https://blog.csdn.net/m0_37264397/article/details/78633055

VScode 配置 C++

两个编译器 g++ gcc
image.png

调整与优化

万能头文件<bits/stdc++.h>

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. //在此处写代码
  5. }

优点

  1. 节省大量写和搜头文件的时间
  2. 非常简洁,一行代码就够了

    缺点

  3. 包含头文件太多,编译很费时间

  4. 在老版本的编译软件里并没有该头文件