杂项
c++ 相关杂项
nullptr
C语言中NULL定义为(void *)0,可以隐式转换为指针类型;但C++中NULL定义为0(强类型语言,void*不能转化为其他指针类型,因此修改了定义),可以隐式转换为整数类型和指针类型。为了解决函数重载时NULL的二义性,C++11中引入了nullptr关键字,表示空指针,可以隐式转换为任意指针类型。即使用nullptr代替NULL,而NULL代替0。
const class nullptr_t
{
public:
// 重载了指针类型的隐式转换
template<class T>
inline operator T*() const
{ return 0; }
// 重载了成员指针类型的隐式转换
template<class C, class T>
inline operator T C::*() const
{ return 0; }
private:
void operator&() const;
} nullptr = {};
智能指针
shared_ptr
std::shared_ptr 是一种智能指针,它能够记录多少个shared_ptr 共同指向一个对象,从而消除显式delete,引用计数为0时自动释放内存。
通常使用make_shared来创建shared_ptr,因为make_shared是原子操作,不会出现内存泄漏。
unique_ptr
std::unique_ptr 是一种独占式智能指针,它能够确保同一时间只有一个unique_ptr指向一个对象,不支持普通拷贝和赋值,但支持移动构造和移动赋值。
库
静态库制作和使用
gcc -c xxx.c
ar rcs libxxx.a xxx.o
# 用户级库放在/usr/local/lib下
gcc -static -o main main.c -L. -lxxx
动态库制作和使用
gcc -fPIC -shared -o libxxx.so xxx.c
gcc -o main main.c -L. -lxxx
Makefile
一个通用的模板
CXX = g++
TARGET = server
CFLAGS = -std=c++14 -O2 -Wall -g
LIBS = -pthread -lmysqlclient
SRCDIR = ./code
# 找到源目录下的所有.cpp文件
SRC = $(shell find $(SRCDIR) -name "*.cpp")
# 将所有.o文件放在bin目录下
DESDIR = ./bin
# 将所有.cpp文件转换成DESDIR目录下的.o文件
OBJS = $(patsubst %.cpp, $(DESDIR)/%.o, $(notdir $(SRC)))
# 找到所有的源文件目录,后续生成.o时可以从这些目录中找到对应的.cpp文件
SOURSE_DIR = $(dir $(SRC))
vpath %.cpp $(SOURSE_DIR)
$(TARGET): $(OBJS)
$(CXX) $(CFLAGS) $(OBJS) -o $@ $(LIBS)
$(DESDIR)/%.o: %.cpp
$(CXX) -c $< -o $@ $(LIBS)
.PHONY: clean
clean:
rm -rf $(OBJS) $(TARGET)
make 编译
make clean 清理
make install 安装到/usr/local/bin(二进制文件),/usr/local/lib(库)以及/usr/local/include(头文件)
命令前加@可以控制不显示命令
git
git clone 报错Clone succeeded, but checkout failed
在ubuntu 22.04中并没有观察到这个问题,而在windows中有。
可能的原因是文件名过长导致checkout失败,
运行git config --system core.longpaths true即可。
或者名字格式在NTFS中不符合规范,比如invalid path 'Lab6/ramdisk-rpi4/gba_roms/OpenLara.gba:Zone.Identifier'
运行git config core.protectNTFS false即可。
reference
gdb
p/* 查看寄存器或计算结果的值
x/* 查看内存值
x显示为16进制
d显示为10进制
u无符号10进制数
c显示为字符 ASCII