C语言宏定义与预处理、函数和函数库

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


(1).
源代码.c,预处理过的.i文件,汇编文件.s,目标文件.o,可执行程序.elf,
预处理器,编译器,汇编器,链接器,这些工具合起来就叫做编译工具链,


gcc中只预处理不编译的方法,gcc -E xx.c -o xx,
只编译不连接,gcc xx.c -o xx,


(2).
#include<xx.h>,
只到系统指定目录去找头文件,
#include"xx.h",
首先找当前目录,然后找系统目录,


编译-I参数包含头文件所在文件夹,#include<xx.h>,


条件编译,
#define NUM //有这句话,a=111,没有a=222,
int a;
#ifdef NUM
a=111;
#else
a=222;
#endif


#ifdef和#if的区别是,前者判断符号存在与否,后者判断逻辑真假,


(3)~(4).
宏定义,原封不动的替换,
#define X(a,b) a+b
int x=1,y=2;
int c = X(x,y); //替换后为int c = 1 + 2;
 
#define X(a,b) a+b
int x = 1, y = 2;
int c = 3*X(x,y); //替换后的结果为int c = 3*1+2; 大失所望吧~
//所以最好是每个都加括号,#define X(a,b) ((a)+(b))

#define MAX(a,b) ((a)>(b)?(a):(b)) //比较两个数的大小,


#define SEC_PER_YEAR (365*24*60*60UL) //这里的难点是,数字默认int,而这里的这个数字超过了int的范围,所以需要声明为无符号数


像MAX(a,b),使用起来已经看不出来是不是函数了,
宏定义是在预处理期间原地展开的,
而函数是在编译期间处理的,是通过调用实现的,调用会有相应的开销,
函数相对于宏定义有参数检查,返回值类型检查,


内联函数,是宏和函数的结合,有参数检查,同时不用调用开销,能原地展开,




debug版本和release版本,
#define DEBUG
//#undef DEBUG
#ifdef DEBUG
#define debug(x) printf(x)
#else
#define debug(x)
#endif


(5).
传参不要太多,
少用全局变量,


(6).
函数名表示了这个函数在内存中的地址,用函数名来调用执行函数,实质就是指针解引用访问,




(7).
用递归函数来计算阶层,
int jiecheng(int n)
{
if( n<1 )
{
return -1;
}
if( 1==n )
{
return 1;
}
else
{
return (n*jiecheng(n-1));
}
}




(8).
.o目标文件,
.a静态链接库文件,


有些库函数链接时需要额外用-lxxx来指定链接,
如果是动态库,要注意-L指定动态库的地址,


(9).
字符串函数,
字符串处理的需求是客观的,
string.h在/usr/include中,


(10).
数学库函数,
真正的数学运算的函数定义在:/usr/include/i386-linux-gnu/bits/mathcalls.h,


(11).
自己制作静态链接库并使用,


(12).
自己制作动态链接库并使用,




你可能感兴趣的:(C语言)