C语言编译常见错误(预处理)
【include】
-
include有两种形式
1、#include "name"——从当前目录下寻找(自定义头文件)
2、#include <name>——从系统的环境变量中寻找(系统库)
错误一
头文件寻找位置不正确
修改之前的【test.c】文件(将宏定义单独作为一个头文件【test.h】添加)
此时系统因为不能在当前文件目录下寻找到【test.h】文件报错
若将#include <test.h>修改为
#include "test.h"则无报错
错误二
不能在当前目录下找到头文件
新建一个存放头文件的库【inc】,并将头文件【test.h】移入inc中
此时系统还是因为不能在当前文件目录下寻找到【test.h】文件报错(即使使用了
#include "test.h")
解决方法一:在【test.c】中将头文件寻找位置写清楚——
#include "./inc/test.h"
解决方法二:使用
命令【gcc -I】+查找头文件的目录
,也可以是
gcc -I inc/ -o Hello test.c
错误三
链接错误——语法之类的没错,最后打包时出错——功能不完善、生成可执行文件时汇总不完全
示例:
在【test.c】中新增一个空函数fun(无返回值,无参数)
此时因为系统不能链接函数fun的实现而报错(虽然编译正确)
//collect2说明链接器报错
解决方法一:实现函数fun的功能(本例给一个空功能也行)
解决方法二:在其他【.c】文件中编写实现本函数功能的代码
//相当于在别的文件中编写模块并在主程序中一起链接后使用
此时要将两个【.c】文件一起打包生成可执行文件
-
引出问题:多个【.c】文件如何打包成一个可执行文件?
解决方法一:gcc -I inc/ -o Hello test.c fun.c——GCC自动将每个【.c】文件编译后一起打包
解决方法二(推荐):先将每个【.c】文件使用
gcc -c汇编完成输出得到【.o】文件最后再一起交给GCC打包
【define】
基本介绍:#define 名称:宏 目的:替换(不进行语法检查)
-
define有两种形式
1、#define 宏名 宏体
EX:#define ABC 6
2、#define 宏函数 宏体
EX:#define ABC( x ) 1 + x
宏体随着宏函数参数改变而改变
-
条件编译:#ifdef、#ifndef——#else——#endif
-
预定义宏(系统定义宏)
__FUNCTION__ :函数名
__LINE__ :行号
__FILE__ :文件名
使用预定义宏的示例:
依次打印【当前函数名】、【文件名】、【行号】得到
用一个函数封装打印操作,可以看到在主函数中调用函数也能定位到封装函数中的行号
//在调试程序中可以快速定位函数具体在哪一行执行