首页 > 技术文章 > c预处理和宏

sailorlee11 2020-12-17 22:52 原文

文件的预处理

#include "xxx.h"
1 首先查找当前源文件所在的路径
2 查找工程的头文件搜索路径

#include <xxxx.h>
查找工程的头文件搜索路径

如果想要自己编写的头文件加入搜索路径之中,就需要在CMakeLists 添加
include_directories("xxx(文件夹)")

还需要添加 实现的.c文件 以及文件的路径目录。
比如说自己写了一个

编译器不知道你写了一个factorial.c这个文件,因此需要把文件路径添加进去,让其编译。
add_executable(c_pra_1 main.c src/factorial.c)

头文件用来导出函数模型,源文件用来实现函数

宏函数

宏函数是直接原封不动地替换,和函数调用不相同,并没有先后计算的说法。因此传入的参数一定要是没有副作用的才可以。
#define MAX(a,b) (a)>(b) ? (a):(b)

#define IS_HEX_CHARACRER(ch) \
((ch)>='0' && (ch)<='9')||   \
((ch)>='A' && (ch)<='F')||   \
((ch)>='a' && (ch)<='f')

宏的定义,返回值参数是没有类型的概念

条件编译

1 #ifdef 如果定义
2 #ifndef 如果没有定义
3 #if 如果。。

前面所有的判断需要加上这个才可以结束 #endif

如果不想在代码中定义宏,就可以直接在CMakeLists文件中定义,比如说,想要定义#define DEBUG,即可在文件中添加下面一行
target_compile_definitions(${name} PUBLIC DEBUG)

判断c++平台等

#ifdef __cplusplus
extern "C"{
#endif

中间可以填写其他函数
int ADD(int left,int right);

#ifdef __cplusplus
};
#endif

重现PRINTF

使用宏定义 #define PRINTLNF(format,...)printf(format"\n",##VA_ARGS)
传递参数#define PRINT_INT(value)PRINTLNF(#value":%d",value)
使用一些行号列号#define PRINTLNF(format,...)printf("("FILE":%d) %s:"format"\n",LINE,FUNCTION,##VA_ARGS)

推荐阅读