天天看点

C++学习记事本

template显式实例化与隐式实例化

模板实例化都是在编译期完成的,不管是显式实例化还是隐式实例化。

区别是隐式实例化只有到编译器发现某个模板实例需要用到时,才会进行实例化。显式实例化可以提前告诉模板去为某个类型进行实例化,无论后面会不会用到它。

所以,显式实例化可以将模板的声明和定义分离,隐藏实现,前提是我们只会用到被显式实例化的几个类型。而隐式实例化不可以,如果分离,编译时会无法链接(因为找不到定义/实现)。

https://en.cppreference.com/w/cpp/language/class_template

typename使用规范

对于用于模板定义的依赖于模板参数的名称,只有在实例化的参数中存在这个类型名,或者这个名称前使用了typename关键字来修饰,编译器才会将该名称当成是类型。除了以上这两种情况,绝不会被当成是类型。

链接器指令

-I 指定头文件最先搜索目录,即最先搜索的include文件目录,-I.为优先搜索当前目录下头文件

-L 指定库文件最先搜索目录,即最先搜索的lib文件目录,-L.为优先搜索当前目录下库文件

-l 对静态库和动态库的缩写,就是对对应的后面参数加上lib,然后加上对于静态库,后缀为.a,对于动态库,后缀为.so

-static 由链接器构造一个完全链接的可执行目标文件,可以直接加载运行,而无需更进一步的链接,文件会很大

编译器指令

-D宏名 在编译时定义宏,-Dkey=value为在编译时定义宏名为key,值为value的宏,常用于此处的宏伟DEBUG,DDEBUG,来标记编译形式。

构建库文件

-shared -fpic 构建动态链接库,输出一般为源文件前加lib后加.so后缀,输入为源代码文件

对于-fpic无法编译的文件,使用-fPIC重新编译,编译构建工具为gcc,实际构建中使用-shared参数调动链接器对以位置无关性参数编译生成的.o文件进行链接

ar rcs 为构建静态链接库的工具,输入为.o文件,需优先使用gcc将源文件编译为.o文件,再使用ar工具进行构建,输出为源文件名前加lib后加.a后缀

由此可见,库文件都是由.o文件组合而成

局部静态变量

使用局部静态变量,来控制第一次调用函数和未来调用函数的不同操作

static bool wait = false;
if (wait) {
	if (condition) {
		wait = false;
	}
	return 0;
}
wait = true;
return 0;
           

继续阅读