-------------🤔️gcc编译命令及文件查看命令---------------------------------------------------------------------
应用名 -v //查看应用安装信息,如gcc -v
gcc -o输出的文件名(编译文件的名称) 输入文件名(要被编译文件的名称)或者gcc 输入文件名(要被编译文件的名称) -o 输出的文件名(编译文件的名称) //注意文件后缀名
cp 001.c 002.cpp //将001.c内容 copy到002.cpp(在同一目录下新建002.c)
./编译文件的文件名 //显示编译文件的内容
vi + .c/.i/.s/.o文件名 //显示.c/.i/.s/.o文件内容
gcc -v -o //打印翻译官信息
gcc -I 跟查找头文件的目录 -o //帮助查找头文件
gcc -D //在预处理前增加一次define 如gcc -DABC (-o) ===在-o(编译)之前进行#define ABC
def和include不是关键字,是预处理命令
gcc -E -o //🚩️预处理(替换,处理了def include这些东西),将.c文件处理为.i文件(cpp工作 cpp -o a.i 001.c)
gcc -S -o //🚩️编译(处理的是关键字及运算符),将.c转换成.s文件输出(CC1工作 CC1 -o a.s 001.c)
gcc -c -o //🚩️汇编 生成原材料(这一步也可完成上一步功能),将.c/.s文件转换成.o文件输出(as工作 as -o a.o a.s)
gcc -o // 🚩️链接(这一步也可完成上两步功能)(collect2工作 collect2 -o build a.o+...)
--------------🤔️c语言中常见错误--------------------------------------------------------------------------------
一:预处理错误
#include<...>和include"..."的区别:<...>是在系统目录寻找...,而"..."是在当前目录寻找...
No such file or directory (not find)----未区分#include <name>/#include "name",编译器找不到头文件。gcc -i 跟头文件位置可以帮助寻找头文件
二:编译错误
语法、符号等有问题
三:链接错误(原材料不够(undefine)或多了(multiple definition比如多次定义了某函数))
有多个.c文件时可以先分别gcc -c 汇编生成相应原材料,最后gcc -o链接这些原材料
寻找标签是否实现,未实现就在连接中加入相应原材料;如果多次实现了标签保留一个就好
--------------🤔️c语言预处理-------------------------------------------------------------------------------------
一.预处理的使用
#include 包含头文件
#define 宏 (替换)
#define 宏名 宏体 //宏名宏体之间至少一个空格,这里不进行语法检测,一般习惯加宏体及宏函数中变量外加括号防止出现一些优先级错误
#define 宏名(x) 含x的宏体 //宏函数。如 #define A(x) (5+(x)) ,A(1)即可代替6
#ifdef #else #endif
预定义宏(gcc或编译器已经定义好的) 注意下划线*2!!!
__FUNCTION__ :函数名
__LINE__ :行号
__FILE__ : 文件名
这些定义宏可以帮助调试,确定相关代码运行位置
宏展开下的#、##
一.# 字符串化 //可以用于为字符串赋值
例如将ab赋值给ABC:
#include <stdio.h>
#define ABC(x) #x
int main()
{
printf(ABC(ab\n));
return 0;
}
输出: ab
二.## 连接符号
例如连接myday和变量x
#include <stdio.h>
#define DAY(x) myday##x
int main()
{
int myday1 = 10;
int myday2 = 20;
printf("the day is %d\n",DAY(1));
}