开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情。
一、预处理指令
-
头文件包含
#include-
注意
“”与<>区别 -
<>系统头文件“”自定义头文件
-
-
宏定义
-
不重视作用域
-
可以利用
#undef卸载宏 -
宏常量 没有数据类型
-
宏函数 要注意表达式完整性
-
-
条件编译
-
测试存在
#ifdef -
测试不存在
#ifndef -
自定义条件测试
#if
-
-
特殊宏
-
编译所在文件
__FILE__ -
编译所在行号
__LINE__ -
编译日期
__DATE__ -
编译时间
__TIME__
-
示例程序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//1、 头文件包含 #include "" 自定义头文件 <> 系统头文件
//2、 宏定义
// 不重视作用域 可以利用 undef 卸载宏
// 宏定义的常量 没有数据类型的
void test01()
{
#define MAX 1024
//#undef MAX
}
//3、条件编译
//#define DEBUG
#ifdef DEBUG //如果是 DEBUG版本 走下面代码
void func()
{
printf("debug版本调用\n");
}
#else
#if 0 //自定义条件编译
void func()
{
printf("release1版本调用\n");
}
#else
void func()
{
printf("release2版本调用\n");
}
#endif
#endif
//4、特殊宏
void doWork( char * p)
{
if (p == NULL)
{
printf(" 文件 : %s 的 %d 行 出错了!\n", __FILE__, __LINE__);
printf("日期:%s\n", __DATE__);
printf("时间:%s\n", __TIME__);
return;
}
}
void test02()
{
doWork(NULL);
}
int main(){
//printf("MAX = %d\n", MAX);
//func();
test02();
system("pause");
return EXIT_SUCCESS;
}
二、静态库与动态库
- 静态库配置
-
创建项目 --- 配置属性 --- 常规 ----- 配置类型 --- 静态库
-
重新生成项目 ,创建出后缀名为 .lib的静态库文件
-
测试静态库
- 动态库配置流程
-
静态库优缺点
-
优点 : 生成的exe程序中包含了 静态库中的内容,与静态库无瓜葛
-
缺点 : 浪费资源 , 更新发布比较麻烦
-
-
动态库
-
运行阶段才去链接函数
-
配置流程: 创建项目 --- 配置属性 -- 常规 --- 配置类型 --- 动态库
-
重新生成解决方案,生成
.dll.lib库文件 -
导入函数 只能在当前项目下使用
-
导出函数 可以在外部使用
-
__declspec (dllexport) int mySub(int a, int b); -
测试 引入
#pragma comment(lib,"./mydll.lib")
-
三、递归函数
-
函数自身调用自身,必须有结束条件退出循环
-
案例
-
实现字符串逆序遍历
-
实现斐波那契数列
-
递归函数解析图
四、面向接口编程
-
实现公司中编程方式
-
甲方和乙方商定好接口,分别实现自己的功能
-
最后对接成功后,实现游戏功能