#ifdef、#else、#endif
C++中#ifdef、#else、#endif 都是预处理命令,称为条件编译命令。
其中,#ifdef 后接一个标识符和程序段1,#else 后接程序段2和结束条件编译段的预处理命令 #endif。
其中所有的预处理命令都必须换行写,且单独占一行。
其意义为:如果标识符已经用宏定义命令进行过定义,编译程序段1,跳过程序段2;否则,跳过程序段1,编译程序段2。
#define 定义一个预处理宏
#undef 取消宏的定义
#if 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志
defined 与#if, #elif配合使用,判断某个宏是否被定义
int32_t
int32_t run_time = -1;
int32_t
是有符号整数类型,宽度正好为32位,没有填充位,负值使用2的补码。
int_least32_t
是最小有符号整数类型,宽度至少为32位。 仅当实现直接支持该类型时才提供这些。
char *ptr、char const *ptr、char * const ptr
char *ptr;
定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。
char const *ptr;
此种写法和const char *等价,大家可以自行实验验证。
char * const ptr;
定义一个指向字符的指针常数,即const指针,实验得知,不能修改ptr指针,但是可以修改该指针指向的内容。
stoi()
是C++的字符处理函数,把数字字符串转换成int输出,头文件是#include<string>, stoi的参数是const string*,不需要将其转换成const char*。
ofstream、ifstream
ofstream是从内存到硬盘,ifstream是从硬盘到内存。
在实际应用中,根据需要的不同,选择不同的类来定义;如果想以输入方式打开,就用ifstream;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。
如果想读取一个文件的内容,那么首先需要将文件以输入方式打开( ifstream ),此时将文件调入内存,若是需要将内容输出到屏幕上,可以使用getline函数实现。
fstream.h是头文件,是对文件操作使用的。 继承 iostream; fstream 拥有iostream功能,但并不是包含关系。 fstream 是对文件操作,而 iostream 是 对 标准输入输出文件的操作。
在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。
atomic简介
C++11起提供了atomic,可以使用它定义一个原子类型。
原型: template< class T >
struct atomic;
成员函数:atomic提供了一些与原子操作有关的成员函数。
store 原子地以非原子对象替换原子对象的值
load 原子地获得原子对象的值