Boost
先问是不是,再问为什么?
Linux命令
ldconfig ldconfig是一个动态链接库管理命令 update动态链接库
boost.filesystem以实现可移植的文件系统的操作为目标
大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库
regex 正则表达式库
CMakeList.txt
find_package(Boost REQUIRED COMPONENTS filesystem system iostreams)
如果boost库的安装位置不是在系统目录下,则还需要在编译时加上-I和-L指定boost头文件和库文件的位置
system库位于名字空间boost::system,需要包含头文件<boost/system/error_code.hpp>
system库使用轻量级的对象封装了操作系统底层的错误码和错误信息,使调用操作系统功能的程序可以很容易的被移植到其他操作系统。
它作为基础部件被chrone、filesystem、asio等库使用
安装
apt-cache search boost
搜到所有的boost库然后:sudo apt-get install libboost-all-dev
filesystem库
filesystem库提供了两个头文件,
一个是<boost/filesystem.hpp> ,这个头文件包含主要的库内容。它提供了对文件系统的重要操作。
同时它定义了一个类path,这个是一个可移植的路径表示方法,它是filesystem库的基础。
一个是<boost/filesystem/fstream.hpp>,是对 std::fstream 的一个补充,
使用可以使用类boost::path作为参数,从而使得 filesystem 库与标准库的关系更亲密。
boost名字空间的一个下级名字空间里,它叫boost::filesytem。
在使用boost.filesytem之后,链接时需要加“-lboost_filesystem-mt”选项,因为这个需要额外的链接,并非一个纯头文件的库。
Boost库曾经有一个-mt后缀来表示它们是多线程感知的
g++ - 4.9 -lboost_filesystem -lboost_system -std = C ++ 11的main.cpp -o ./path-test
-l 表示:编译程序到系统默认路进搜索,如果找不到,到当前目录,
如果当前目录找不到,则到LD_LIBRARY_PATH等环境变量置顶的路进去查找,
如果还找不到,那么编译程序提示找不到库。
在CMakeList.txt
find_package(Boost COMPONENTS system filesystem regex REQUIRED)
include_directories ( ${Boost_INCLUDE_DIRS})
target_link_libraries(projectname ${Boost_LIBRARIES})
gcc是GCC中的GUN C Compiler(C 编译器). g++是GCC中的GUN C++ Compiler(C++编译器)
文件系统不是串行系统-如UNIX系统存在符号链接的概念,而Windows中不存在,所以当你使用符号链接的时候就说明你不可能做到可移植性。
程序:
#include<iostream>
#include<fstream>
#include<boost/filesystem.hpp>
namespace bf=boost::filesystem;//简单别名
void create_directory(const std::string &path) {
if (!bf::exists(path) || (bf::exists(path) && !bf::is_directory(path))) {
bf::create_directories(path);
}
}
int main(int argc, char **argv) {
std::string output_dir = temp + "/output";
create_directory(output_dir);
}
IO
<ios> iostream 基类
iostreams 最简单的用法仅要求包含标头 <iostream>。 然后可从 cin 或 wcin 提取值来读取标准输入
<fstream>
<iomanip>
<ios> <iosfwd>
<iostream> <istream> <ostream>
<sstream> <streambuf> <strstream>
#include <iostream>
#include <fstream>
#include <iomanip> manip是manipulator(操纵器)的缩写
iostream 是对屏幕上输入输出
区分为:istream和ostream
用using namespace std;则表示用标准空间,这样才能用cin,cout, endl
cin是C++编程语言中的标准输入流对象,即istream类的对象,cin一般使用的是行缓冲机制
cout是流的对象,即ostream类的对象,这里的标准输出指的是命令行窗口
cout 是console output的缩写
cerr 是不经过缓冲区,直接向显示器上输出有关信息,
clog 中的信息存放在缓冲区中,缓冲区满后或遇到endl时向显时器输出。
fstream 是对文件输入输出,文件读写内容
std::ios::out | std::ios::app
以 ios::app|ios::out,如果没有文件则创建文件,如果有文件,则在文件尾追加
缓冲 缓冲区(buffer)
缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲
对磁盘的读写 键盘输入数据 标准错误stderr
缓冲刷新
缓冲区满 执行flsuh语句 执行endl语句 关闭文件
清空缓存区-clear()
#include <iomanip> 说明:是I/O流控制头文件
std::setprecision(int n)) 将指定浮点数字的小数点后要显示的位数,而不是要显示的总有效数位数
是 #include<map> 还要 using namespace std;
std::map<std::string, std::string> map是一个关联式容器,所谓的关联式容器,也就是类似与关联性数据库
std::string 与 #include <string>
<string>包含在某种程度上通过<iostream>,
如果意外地决定不再需要<iostream>并删除包含,<string>也会被隐式删除
std::memcpy
std::to_string
std::string::npos 表示的是一个size_type类型的常量,其值等于size_type类型可以表示的最大值
npos是一个常数,用来表示不存在的位置,string::npos 代表字符串到头了结束了
标准库
标准函数库
标准函数库分为以下几类:
输入/输出 I/O
字符串和字符处理
数学
时间、日期和本地化
动态分配
其他
宽字符函数
面向对象类库
标准的 C++ 面向对象类库定义了大量支持一些常见操作的类,比如输入/输出 I/O、字符串处理、数值处理。面向对象类库包含以下内容:
标准的 C++ I/O 类
String 类
数值类
STL 容器类
STL 算法
STL 函数对象
STL 迭代器
STL 分配器
本地化库
异常处理类
杂项支持库
编译器
传统编译器里分为前端,优化和后端,
其中前端和语言打交道,
后端和机器打交道
现代编译器的的前端和后端分的很开,而他们之间的共同桥梁就是IR
GCC,MSVC,CLANG是目前最主流的C/C++编译器,编译器是一组程序(这里包含链接等程序),
它们的主要作用是将C/C++源代码翻译成可以执行的机器字节码(可执行程序)
MSVC ,就是微软(MS)的VC运行库。 VC运行库,是Visual C++的运行库
vscode
Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器
LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)
Xcode
编译器前端工具链
CC 即 compiler-compiler
Lex 是 LEXical compiler 的缩写,是一个词法分析器(scanner)的生成工具
Antrl ANTLR是ANother Tool for Language Recognition的缩写
0.编程语言的通用模式:计算机语言模式
序列 sequence
选择 choice
词法符号依赖 token dependency
嵌套结构 nested phrase
处理语言规则:语法解析难点在于规则的循环处理以及分支选择,还有递归调用和复杂的计算表达式等。
处理优先级-左递归和结合性
划定词法分析器和语法分析器--
javaCC 是一个能生成语法和词法分析器的生成程序
Yacc 即 Yet Another Compiler-Compiler,是经典的生成语法分析器的工具
Yacc 生成的编译器主要是用 C 语言写成的语法解析器(Parser),需要与词法分析器一起使用(一般为 Lex)
SQL 解析
IDE中会有大量代码提示的场景,这些代码提示的功能也都可以通过匹配词法分析器输出的
Cygwin是Windows上运行的一个类linux环境
MinGW 是GNU的一些开发工具,例如GCC、GNU 汇编、链接等程序在Windows上的移植,提供了一套Windows上的开发环境。
参考:
cmake中PROJECT_SOURCE_DIR的遐思 https://blog.csdn.net/random_repick/article/details/70045677
第 13 章 使用 C++ 标准库 https://docs.oracle.com/cd/E19205-01/821-0389/bkakb/index.html
https://docs.oracle.com/cd/E19205-01/820-7599/bkaki/index.html
https://docs.oracle.com/cd/E19205-01/820-1214/index.html
https://learn.microsoft.com/zh-cn/cpp/standard-library/cpp-standard-library-header-files?view=msvc-170