杂项

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

posted @ 2024-04-09 20:58  trashwin  阅读(2)  评论(0编辑  收藏  举报