0x00 来啦来啦
0x01 函数
函数不能嵌套,故定义的函数要放在main函数之上(先定义后调用)
int sum(int m,int n){xxxx return xx}
函数声明,用在函数定义前,就被调用的情况,保证程序不报错。
后面再补函数体就行了。
对于多个文件的程序,通常是将函数定义放到源文件(.c文件)中,将函数的声明放到头文件(.h文件)中,使用函数时引入对应的头文件就可以,编译器会在链接阶段找到函数体。
全局变量默认的作用域是整个程序,包括其他文件,
加入static 就只能作用在本文件。
C支持单独代码块
0x1.1递归函数
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。
0x1.2 自带头文件(C标准库)
0x1.2.1 c库用法
https://cplusplus.com/reference/clibrary/
0x1.3 补
尾递归
中间递归
多层递归
递归优化,减少时间
0x20 预处理命令
带有#
的命令,在程序执行前执行。
编译器会将预处理的结果保存到和源文件同名的.i文件中,例如 main.c 的预处理结果在 main.i 中
举个栗子,执行程序前,休眠5秒,要求跨平台,windows 和linux 函数不同,要先判断
#include <stdio.h>
//不同的平台下引入不同的头文件
#if _WIN32 //识别windows平台
#include <windows.h>
#elif __linux__ //识别linux平台
#include <unistd.h>
#endif
int main() {
//不同的平台下调用不同的函数
#if _WIN32 //识别windows平台
Sleep(5000);
#elif __linux__ //识别linux平台
sleep(5);
#endif
puts("http://c.biancheng.net/");
return 0;
}
0x21
include "stdio.h" || include <stdio.h>
双引号包含头文件,编译器会先从当前目录找,找不到在从系统路径找。
尖括号直接从系统路径找
0x22 宏定义
#define N 100
末尾不需要加分号
终止作用域
#define PI 3.14159
int main(){
// Code
return 0;
}
#undef PI
void func(){
// Code
}
带参数的宏定义
#define M(y) y*y+3*y //宏定义
// TODO:
k=M(5); //宏调用
# 在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型
0x23 宏与函数
宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。
0x24 #ifdef 宏名 #ifndef 宏名
补充
编译与链接
标签:03,调用,头文件,函数,文件,--,xueC,include,main From: https://www.cnblogs.com/cmview/p/17092938.html
编译
(Compile)会将源文件(.c文件)转换为目标文件。对于 VC/VS,目标文件后缀为.obj;对于GCC,目标文件后缀为.o。
链接
(Link)是针对多个文件的,它会将编译生成的多个目标文件以及系统中的库、组件等合并成一个可执行程序。