的顺序#包括
标题:
建议排序标题包括从“一般”到“特定”:
- C库标头(对于任何/所有C程序都是不可变的泛型),然后
- 操作系统库标头(不可变的目标平台API),然后
- 应用程序标题(项目翻译单位之间“全球”共享的信息)
请注意#包括<stddef.h>
和include<标准输入。小时
然后,可以从应用程序的头文件中删除新增。小时
(或可能序列。小时
??). 它是翻译单元(新增。c(c)
??) 注意包括所有初步标题之前它使用#包括“new.h”
.
建议通过分离添加“抽象”级别颜色从光标运动从一般展示服务通过添加琐碎服务功能到新增。c(c)
。想象下一个项目是可视化编辑器具有关键字突出显示就像现在大多数IDE一样。请记住白色
用于字符常量,以及粉红色
关键字,以及。。。将驱动编码器疯了!不要为颜色、光标和显示函数共用约40个标记,每个标记只能通过2个门户检索,而是使用有意义的名称编写单独的函数。这个第一银行出租车是您的cls()
(或清除()
在某些环境中)。函数名说明了一切;无需公开ANSI Escape Code或引用该代码的“自制”标记。只是一个非常特定的函数调用,它执行一个非常特殊的函数。考虑一下。。。(例如,电子表格使用每个单元格及其所有属性的内部表示。单元格B52型
在公式中如何引用和渲染一个单元格。在内部,细胞可能被称为QZH374_FF型
内部模型和用户所见之间的分离/转换提供了极大的灵活性!)例如,玩,set_text();
和set_alert();
作为功能知道并始终输出正确的ANSI字符串,表示“黑底白”文本和“红底白”文本。
请注意,所有这些枚举
标记仅对使用它们的源文件可用。它们不必公开,因此整个枚举
应该是静止的
在源文件中使用两个获取工具栏(_foobar)
功能。这只剩下头文件中的两个函数原型(应该是这样)。(是吗新增。小时
或序列。小时
?) (供将来参考:将每个文件的名称作为代码的第一行。例如://我的文件1.c
。在SO上为您自己和我们这样做。写,现在是xxx文件很难引用所引用的代码段。)
(琐碎:#定义SEQUENCES_H
就足够了。虚假的1
在那一行是没有必要的。)
应用程序头文件很少需要#包括
其他头文件。C标准库标题绕过了这一建议,但这些标题是由专家编写的,以方便非专家。
复杂项目可以组合按等级划分来自许多件其中任何“层”都可以访问下级API,而这些API又可以访问自己的下级API(低级“助手”功能)结构,一个人可以达到不透明度编写健壮代码的圣杯封装并简化了写入/运行单元测试代码。
如果组织良好,“顶级”源文件可能不需要知道真正的低级处理是如何发生的(即,它们不需要包含任何内容,只需要包含自己的下级头文件。)
“一路上都是乌龟……”
未测试:(有点微不足道……)测试线束清除终端显示(两次)。
光标应该自动恢复到行/列(1,1)
没有显式地将其移动到那里。
考虑交换名称片段的顺序:
颜色_绿色_更多
到颜色_红色_绿色
(前缀是“COLOR”,然后是“FORE/BACK”,最后是特定的“粗糙”颜色名称)。
甚至(品尝)。。。
前_彩色_绿色
正如在正常讲话中所说的那样。
例子:
前_彩色_红色前_彩色_白色前_颜色_蓝色
我的首选是能够识别,然后忽视,在扫描/搜索相关“标记”列表时(必须)重复的前缀。
如果你能容忍极端的助记符缩写:
FG_彩色_红色FG_彩色_白色FG_颜色_蓝色//行故意留空黑色_彩色_红色例如,BK_COLOR_WHITE//或BG_COLOR-WHITE黑色_彩色_蓝色
以下是提供给OP的示例代码,目的是“了解其他做事方式”。OP已接受此提议。这些代码片段来自我的自制数独解算器,它可以在VT100兼容设备(Windows终端)上进行闪烁显示。所有这些都是“紧凑”的,有些删节,可能包含卵子。
//显示.h枚举{CLR_WhtOnBlk,//<=与ANSI字符串数组对齐CLR_BlkOnBlk、,清除阻止组,CLR_BlkOnYlw,清除,CLR_ BlkOnPnk,CLR_BlkOnGry,清除,CLR_Normal=CLR_WhtOnBlk,//给定有意义的名称CLR_Puzl=CLR_BlkOnGrn,CLR_Keep=CLR_BlkOnGrn,CLR_Elim=CLR_BlkOnYlw,CLR_Erase=CLR_BlkOnBlk,CLR_Pause=CLR_BlkOnGry,};char*clrStr(int clr);void dispCell(单元格*p,int v,int clr,int hld);void dispExam(单元格*p,int v,int clr);无效光标(int ONoff);void dispDebugErase(int r);
//显示.c#include(包括)<stdio.h>、<string.h>和<stdarg.h#包括“main.h”、“solve.h”、“helper.h”、“display.h”//您将获得漂移char*clrStr(const int clr){静态字符*cstr[]={“\033[0;0m”,//wht on blk-CLR_WhtOnBlk“\033[40;30m”,//黑色-CLR_BlkOnBlk“\033[102;30m”,//blk on grn-CLR_BlkOnGrn“\033[103;30m”,//blk on ylw-CLR_BlkOnYlw“\033[105;30m”,//blk on pnk-CLR_BlkOnPnk“\033[47;30m”,//黑色,灰色-CLR_BlkOnGry“\033[106;30m”,//蓝色黑色};返回cstr[clr];}静态void printAt(int r,int c,int clr,char*str){打印f(“\033[%d;%dH%s%s”,r,c,clrStr(clr),str);}无效光标(int ONoff){打印(“\033[?25%c”,“lh”[开关]);}//最后一个参数'hld'是在继续之前暂停的持续时间。是时候思考了。void dispCell(单元格*p,int v,int clr,int hld){int r=PuzlTL_r+p->行*2;int c=PuzlTL_c+p->col*4;char str[]=“”;str[1]=v2ch(v);//将int 7转换为“7”printAt(r,c,clr,str);//output@row,col和fg/bg颜色,字符串。。。}void dispDebugErase(int r){打印位置(r,1,CLR_Normal,“\033[0J”);}