接口:(一般项目中与宏定义一起使用)
__declspec(dllexport):用在函数声明前,此前缀是用来实现生成dll文件时可以被导出至dll,即提供调用接口。
__declspec(dllimport):在调用dll中的接口时,用此前缀声明函数,进而可以调用之前export到dll中的接口
extern:
- 同文件中,如果在一个文件中main函数在前,但是其中调用main函数后面才声明定义的变量或函数,那么可以在main其中加extern前缀,实现正常调用。否则编译器从main文件上方编译时找不到使用对象,会报错。
- 不同文件中,同上,也是要先声明,如extern int a;或者extern void func(arg);
- 注意:extern只对全局变量才起作用,因此局部变量是不行的。函数是可以的,因为所有的函数都是全局的。
- 使用extern比include头文件的好处就是,更加直接,直接取某一个对象。
extern "C":
- 因为c++与c的编译方式不一样,比如函数在c++的编译过程中会加上一些前缀然后再链接。而c不是这样。因此如果在编译时把c的代码用c++的方式编译,会产生编译连接错误。因此当在c++中引入c的库时要加extern "C",使项目能智能地选择编译方式。
.hpp文件:(预编译头文件)
- 其实就是将.cpp文件和.h文件放在一个文件中(将定义和声明放在一起被包含)
声明和定义的区别:
- 定义:给出对象位置(名称),大小(类型)。最本质的是开辟内存空间。
- 声明:不会开辟内存空间
- int i,既是定义也是声明。extern i,声明。
- 一个项目中定义只能做一次,而声明可以多次。函数声明也叫函数原型 type func();
- 为何要先声明后使用?因位这样在编译时可以让编译器核对你后面是否使用正确,如参数个数,返回类型等。
typedef和define的区别:前者是编译处理,后者是预处理。