在工程中,常常用宏来实现一些比较高级的功能.
防止头文件重复包含
头文件重复包含
如果在一个c程序中,一个头文件被实质包含了多次,那么很可能造成变量重复定义,循环依赖等问题,而造成编译不通过.以下图为例:
#include<stdio.h>
int va=1;
其中文件的依赖关系为:
#include
#include
#include
B.h
A.h
main.cpp
那么在编译main.cpp时,因为实质包含了两次A.h,那么就会出现两次int va=1,编译会失败.
使用条件编译防止头文件重复包含
通过定义无值的宏可以防止头文件重复包含.使用了条件编译的头文件example.h基本格式为:
#ifndef MACRO
#define MACRO
... ...
#endif
当第一次包含example.h,此时并没有定义MACRO宏,因此会继续执行,而当第二次包含example.h时,由于第一次包含example.h时已经定义MACRO宏,因此程序直接跳转到#endif,这样就避免了一个头文件多次包含.
跨平台符号导入导出
由于Linux和Windows平台的符号导入导出策略不同,因此可以使用条件编译,在不同平台下定义不同的宏,以此实现代码的跨平台.
定义宏
if(win)
#define IMPORT __declspec(dllimport)
#define EXPORT __declspec(dllexport)
else
#define IMPORT
#define EXPORT
使用宏
在A.h中定义需要导出的变量 int EXPORT a=1 在B.h中定义需要使用变量a的符号
void IMPORT print(){
printf("the value of the variable imported from A.h is: %d\n",a)
}
具体用法参见:juejin.cn/post/715585…