C语言提高篇(笔记)

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情

一、预处理指令

  1. 头文件包含 #include

    • 注意 “”<> 区别

    • <> 系统头文件 “” 自定义头文件

  2. 宏定义

    • 不重视作用域

    • 可以利用 #undef 卸载宏

    • 宏常量 没有数据类型

    • 宏函数 要注意表达式完整性

  3. 条件编译

    • 测试存在 #ifdef

    • 测试不存在 #ifndef

    • 自定义条件测试 #if

  4. 特殊宏

    • 编译所在文件 __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;
}

二、静态库与动态库

  1. 静态库配置
  • 创建项目 --- 配置属性 --- 常规 ----- 配置类型 --- 静态库

  • 重新生成项目 ,创建出后缀名为 .lib的静态库文件

  • 测试静态库

  1. 动态库配置流程
  • 静态库优缺点

    • 优点 : 生成的exe程序中包含了 静态库中的内容,与静态库无瓜葛

    • 缺点 : 浪费资源 , 更新发布比较麻烦

  • 动态库

    • 运行阶段才去链接函数

    • 配置流程: 创建项目 --- 配置属性 -- 常规 --- 配置类型 --- 动态库

    • 重新生成解决方案,生成 .dll .lib 库文件

    • 导入函数 只能在当前项目下使用

    • 导出函数 可以在外部使用

    • __declspec (dllexport) int mySub(int a, int b);

    • 测试 引入#pragma comment(lib,"./mydll.lib")

三、递归函数

  1. 函数自身调用自身,必须有结束条件退出循环

  2. 案例

    • 实现字符串逆序遍历

    • 实现斐波那契数列

递归函数解析图

递归.jpg

四、面向接口编程

  1. 实现公司中编程方式

  2. 甲方和乙方商定好接口,分别实现自己的功能

  3. 最后对接成功后,实现游戏功能