预处理指令
#include // 将指定文件的内容插至此指令处
#include_next // 与#include一样,但从当前目录之后的目录查找,极少用
#define // 定义宏
#undef // 删除宏
#if // 判定
#ifdef // 判定宏是否已定义
#ifndef // 判定宏是否未定义
#else // 与#if、#ifdef、#ifndef结合使用
#elif // else if多选分支
#endif // 结束判定
## // 连接宏内两个连续的字符串
# // 将宏参数扩展成字符串字面值
#error // 产生错误,结束预处理
#warning // 产生警告
#pragma // 提供额外信息的标准方法,可用于指定平台
#pragma GCC dependency <文件> // 若<文件>比此文件新则产生警告
#pragma GCC poison <标识> // 若出现<标识>则产生错误
#pragma pack(1/2/4/8) // 按1/2/4/8字节对齐补齐
#line // 指定行号
预定义宏
一般预定义宏用来写日志文件用 或者找错的时候
BASE_FILE // 正在编译的源文件名
FILE // 所在文件名
LINE // 行号
FUNCTION // 函数名
func // 同__FUNCTION__
DATE // 日期
TIME // 时间
INCLUDE_LEVEL // 包含层数,从0开始
__cplusplus // C++编译器将其定义为1,
// C编译器不定义该宏
#ifndef _PRINT_H
#define _PRINT_H
#include <stdio.h>
void print (void)
{
printf ("__BASE_FILE__ : %s\n", __BASE_FILE__);
printf ("__FILE__ : %s\n", __FILE__);
printf ("__LINE__ : %d\n", __LINE__);
printf ("__FUNCTION__ : %s\n", __FUNCTION__);
printf ("__func__ : %s\n", __func__);
printf ("__DATE__ : %s\n", __DATE__);
printf ("__TIME__ : %s\n", __TIME__);
printf ("__INCLUDE_LEVEL__ : %d\n", __INCLUDE_LEVEL__);
#ifdef __cplusplus
printf ("__cplusplus : %d\n", __cplusplus);
#endif // __cplusplus
}
#endif // _PRINT_H
#ifndef _PREDEF_H
#define _PREDEF_H
#include "print.h"
#endif//_PREDEF_H
#include "predef.h"
int main (void)
{
print ();
return 0;
}
环境变量
C_INCLUDE_PATH - C头文件的附加搜索路径,相当于gcc的-I选项
CPATH - 同C_INCLUDE_PATH
CPLUS_INCLUDE_PATH - C++头文件的附加搜索路径
LIBRARY_PATH - 链接时查找静态库/共享库的路径
LD_LIBRARY_PATH - 运行时查找共享库的路径
通过gcc的-I选项指定C/C++头文件的附加搜索路径:
1.# gcc calc.c cpath.c -I.
将当前目录作为C头文件附加搜索路径,添加到CPATH环境变量中:
# export CPATH=$CPATH:. // export保证当前shell的,子进程继承此环境变量
# echo $CPATH
# env | grep CPATH
也可以在~/.bashrc 或~/.bash_profile,配置文件中写环境变量,持久有效:
export CPATH=$CPATH:.
执行
# source ~/.bashrc 或 # source ~/.bash_profile
//生效,以后每次登录自动生效。
头文件的三种定位方式:
- #include “目录/xxx.h” - 头文件路径发生变化,需要修改源程序
- C_INCLUDE_PATH/CPATH=目录 - 同时构建多个工程,可能引发冲突
- gcc -I目录 - 既不用改程序,也不会有冲突