C语言笔记9:构造类型、预处理、库制作与标准文件操作
本文系统讲解C语言枚举类型、typedef、预处理指令、静态/动态库制作、标准文件I/O五大高级知识点包含斗地主完整游戏案例、跨平台条件编译、静态库与动态库的生成与调用、文本/二进制文件读写实战内容由浅入深、代码可直接运行适合C语言进阶学习、期末复习与面试备考。前言本篇是C语言进阶核心内容覆盖枚举、typedef、预处理、库文件、标准I/O五大模块。枚举让常量更语义化typedef简化复杂类型书写预处理实现宏与条件编译库文件实现代码复用标准I/O完成文件持久化。全文配套可运行代码与实战案例帮你快速掌握C语言工程化开发能力。一、枚举类型 enum枚举用于定义一组相关的符号常量比#define更聚合、可读性更强。1.1 定义与语法enum枚举名{常量1,常量2值,常量3// 自动在前一个值基础上1};默认从0开始递增可手动指定初始值常用于switch分支1.2 示例代码#includestdio.henumWeek{SUN10,MON,TUE,WED,THU,FRI,SAT};intmain(){enumWeekweekWED;printf(WED %d\n,week);// 13return0;}1.3 枚举 switch 实战enumState{SHI_TOU,JIAN_DAO,BU};intchoice;scanf(%d,choice);switch(choice){caseSHI_TOU:printf(石头\n);break;caseJIAN_DAO:printf(剪刀\n);break;caseBU:printf(布\n);break;}二、typedef 类型重命名typedef只为已有类型起别名不创建新类型大幅简化复杂声明。2.1 基础用法typedefunsignedintuint;typedefstructStudentStu;2.2 结构体 typedeftypedefstructStudent{intid;charname[20];}Stu,*PStu;// 使用Stu s1{1,张三};PStu ps1;2.3 复杂指针简化typedefint(*Func)(int,int);Func padd;// 函数指针别名三、综合案例斗地主发牌系统3.1 需求说明54张牌4花色×13点数 大小王初始化 → 洗牌 → 发牌3人各17张 3张底牌格式化打印手牌3.2 完整代码#includestdio.h#includestdlib.h#includetime.h#defineLEN54#definePLAYER_LEN17#defineBOTTOM_LEN3constchar*suits[]{♥,♠,♦,♣};constchar*ranks[]{3,4,5,6,7,8,9,10,J,Q,K,A,2};constchar*jokers[]{小王,大王};typedefstruct{intsuit;intrank;}Card;voidinitDeck(Card*deck){intidx0;for(ints0;s4;s){for(intr0;r13;r){deck[idx].suits;deck[idx].rankr;idx;}}deck[idx].suit4;deck[idx].rank-1;deck[idx].suit5;deck[idx].rank-1;}voidshuffle(Card*deck){srand(time(NULL));for(inti0;iLEN;i){intjrand()%LEN;Card tdeck[i];deck[i]deck[j];deck[j]t;}}voiddeal(Card*deck,Card*p1,Card*p2,Card*p3,Card*bottom){intidx0;for(inti0;iPLAYER_LEN;i){p1[i]deck[idx];p2[i]deck[idx];p3[i]deck[idx];}for(inti0;iBOTTOM_LEN;i)bottom[i]deck[idx];}voidprintCard(Card c){if(c.suit4)printf(%s ,jokers[c.suit-4]);elseprintf(%s%s ,suits[c.suit],ranks[c.rank]);}intmain(){Card deck[LEN];Card p1[PLAYER_LEN],p2[PLAYER_LEN],p3[PLAYER_LEN];Card bottom[BOTTOM_LEN];initDeck(deck);shuffle(deck);deal(deck,p1,p2,p3,bottom);printf(玩家1);for(inti0;iPLAYER_LEN;i)printCard(p1[i]);printf(\n玩家2);for(inti0;iPLAYER_LEN;i)printCard(p2[i]);printf(\n玩家3);for(inti0;iPLAYER_LEN;i)printCard(p3[i]);printf(\n底牌);for(inti0;iBOTTOM_LEN;i)printCard(bottom[i]);return0;}四、预处理指令编译四步骤预处理 → 编译 → 汇编 → 链接4.1 宏定义无参宏#definePI3.14159带参宏必须加括号#defineMUL(a,b)((a)*(b))不加括号会因优先级出错。4.2 条件编译#defineDEBUG1#ifdefDEBUGprintf(调试模式\n);#elseprintf(发布模式\n);#endif#if1// 编译#endif4.3 文件包含系统头文件当前目录优先防止重复包含#ifndef_HEADER_H#define_HEADER_H// 内容#endif五、库文件静态库 动态库5.1 静态库 .a生成gcc-cmylib.c-omylib.o ar-csrlibmylib.a mylib.o使用gcc main.c -L.-lmylib-omain5.2 动态库 .so生成gcc-fPIC-cmylib.c gcc-shared-olibmylib.so mylib.o运行LD_LIBRARY_PATH. ./main5.3 手动加载动态库#includedlfcn.hvoid*handledlopen(./libmylib.so,RTLD_LAZY);int(*sum)(int*,int)dlsym(handle,sum);dlclose(handle);编译gcc dl.c -ldl -o dl六、标准文件 I/O6.1 文件打开/关闭FILE*fpfopen(test.txt,r);fclose(fp);模式r/w/a/r/w/a/rb/wb/ab6.2 单字符读写intchfgetc(fp);fputc(ch,fp);6.3 行读写charbuf[256];fgets(buf,256,fp);fputs(buf,fp);6.4 二进制块读写结构体持久化fwrite(stu,sizeof(Stu),1,fp);fread(stu,sizeof(Stu),1,fp);6.5 文件拷贝实战while((chfgetc(src))!EOF){fputc(ch,dest);}小结枚举批量管理关联常量switch首选。typedef简化结构体、指针、函数指针。预处理宏、条件编译、头文件保护。库文件静态库体积大、无依赖动态库共享、需环境配置。标准I/O文本/二进制读写支持数据持久化。掌握以上内容即可完成C语言工程化、模块化、持久化开发。