C 的 一些写法格式 交流
好久以前刚开始学习前辈们的代码的时候,发现好多代码感到好奇怪.
1)代码看不懂
2)代码格式看不懂
网上也没见同学们分享.当自己代码写多了,也渐渐的理解为什么要这样写了. 说主题之前 还是 说一些 题外话
"代码怎么写,看人,但还是有一些范式的"
下面就说一下,本人用的范式总结如下:
首先 说 C中最重要的 东西 => 函数
1. 函数声明范式
首先是普通函数声明
// 普通函数声明 extern void heoo(int age);
函数声明同时 再科普一下 C中关于 void 的用户,请看下面两行声明代码
// 参数中带void extern void heoo(void); //参数中不带void extern void heoo();
同样是声明,但是意思确实很大的不一样
第一个函数声明 表示
声明了一个 返回值void 函数名是heoo 参数为空的 函数.
第二个函数声明表示
声明了一个 返回值是void 函数名是 heoo 参数不确定 的函数.
解释函数不确定的意思是,看下面代码
//声明 参数不确定的函数
extern void heoo(); //使用阶段,下面这些都是合法的 heoo(); heoo(1); heoo(1,1.00,"232");
现在应该理解了,对于void特殊外,还有一种声明也比较特殊如下
//可变函数声明 extern void heoo(const char *fmt,...);
关于函数声明 补充说明一下
1) 函数声明的时候 extern可以省略,推荐封装库的时候不要省略
2) C中声明参数名 可以省略,推荐不要省略,参数名能让人提高看懂这个接口的可能
3) 函数声明C中什么都不加,默认参数是 不确定,C++ 默认是 void.
2.函数定义范式
首先看下面代码
void heoo(int age) { printf("You age is %d!",age+16); }
这样的写法 是 函数定义部分,返回值占一行 ,是 为了 突出 函数返回值得重要性
还有下面的写法
void heoo(int age) { printf("age = %d.\n",age); }
上面是函数 声明 + 定义 两部分组成的. 应用场景有 如下
static int __getid(void) { static int __id = 0; ++_id; return __id; }
对于静态函数作用域只在当前文件,一般放在 *.c 文件下.那么就不需要声明.
就可以将声明和定义放在一起写.
3.关于其它语法的写法
1) 关于 if 语句
//第一种 if if(age > 0) puts("年龄不小了!"); //第二种if if(age < 0){ age = 0; puts("别乱搞行吗!"); } //第三种 if(age > 0){ puts("age is %d"); exit(EXIT_FAILURE); } else { age = -1; printf("你好吗!"); }
//第四种
if(age > 0){
puts("age is %d");
exit(EXIT_FAILURE);
}
else if(age == -1){
puts("ok");
exit(EXIT_SUCCESS);
}
else {
age = -1;
printf("你好吗!");
}
这里扩展一下,为什么 if 后面跟 {
而 函数 的 { 另起一行,这是 为了 突出 函数重要性,一看 { 就知道是 函数片段.
2) . 关于for语句
//第一种语法 for(i = 0;i<10;++i) i*=2; //第二种写法 for(i=0;i<10;++i){ i*=2; printf("i=%d\n",i); }
同样while语句也是这样写的.
3).关于switch 语句
switch(type){ case 0: puts("hello "); break; case 1: puts("world "); break; default: printf("type =%d fatal error!\n",type); exit(EXIT_FAILURE); }
4)关于goto 语句
//goto 使用方法,在项目较大的时候,还是必须要使用的 for(int i=0;i<10;++i){ for(int j=0;j<9;++j){ if(i+j == 5) goto __hl_puts; } .... } __hl_puts: puts("就这样");
4.扩展总结
到这里基本上关于C代码的书写基本就这样的,但也只是一个简单的开始.因为C的历史很悠久,悠久的历史中有过很多 天才创造出 优秀的范式.例Unix风格,Linux风格,Windows风格等等
上面的范式主要还是Linux C开发风格.外加自己的一些简单理解.
下面 再 说一些 其它,仅供参考.
//全局变量声明 int g_age = 10; //静态变量声明 int __age = 20; //唯一宏判断 #ifndef _H_ADD #define _H_ADD #endif /* !_H_ADD */
写C代码原则就是 简单高效,最小意外原则.还有好多 话题 说 ,但是还是结束吧. 这些 都看 个人喜爱,和愿意投入到那个门派下吧.
最后分享一个 例子 结束 关于C代码规范的分享.
#include "sc_head.h" //将 数组 a[]中数据打乱,按照种子rk来打乱 void swaps(int a[], int len, unsigned rk); //根据周数返回 索引 int week_rand(void); //返回当前 周 和 下一个周的不变量 还有今天在星期的索引 static int* __getwks(void) { #define _INT_WKS (7) //wks[0] 当前周种子,wks[1] 下周种子,wks[2] 当前星期数0表示周日,6表示周六 static int wks[3]; //先获取 当前 周 的周日 距离 这年开始 是多少天 time_t t = time(NULL); struct tm *pt = localtime(&t); //1年的多少天 int yd = pt->tm_yday; //今天是周几 [1,2,3,4,5,6,0] int wd = pt->tm_wday; //经历多少年了 从1900开始计算 int year = pt->tm_year; //这周的不变量是 {一共经历的年数.当前年的周日的总天数} => 这天在历史上不变量 wks[0] = year * 1000 + yd - wd + _INT_WKS; //继续获取 下一周的 周不变量 wks[1] = wks[0] + _INT_WKS; //将其索引变成 [1,2,3,4,5,6,0] => [0,1,2,3,4,5,6] wks[2] = (wd + _INT_WKS - 1) % _INT_WKS; #undef _INT_WKS return wks; } /********************************************************************** $函数名:int main(int argc,char *argv[]); =>程序入口,主逻辑. #返回值:int @参数数:2 =>int argc -> 传入的参数个数 =>char *argv[] -> 参数集,字符表示 ***********************************************************************/ int main(int argc, char *argv[]) { //初始化一些环境 sh_start(true); //打印一条配置 配置见 sc_config.ini 文件 CERR("%s", sc_get("heoo")); //开始 享受吧! pray int rk = 1; srand(rk); int i = 0; //测试通过 for (;i< 10;++i) printf("%d, ",rand()%7); putchar('\n'); srand(rk); for (i=0;i < 10;++i) printf("%d, ", rand() % 7); putchar('\n'); return 0; } //将 数组 a[]中数据打乱,按照种子rk来打乱 void swaps(int a[], int len, unsigned rk) { int i = -1; int idx, tmp; srand(rk); while (++i < len) { idx = rand() % len; tmp = a[i]; a[i] = a[idx]; a[idx] = tmp; } } //根据周数返回 索引 int week_rand(void) { //原始数列 int ws[] = { 1,2,3,4,5,6,7 }, nws[] = { 1,2,3,4,5,6,7 }; //现在 我们 获取 了 这周的种子wkd 和 下周的种子nwkd int *wks = __getwks(); //开始初始化 swaps(ws, sizeof ws / sizeof *ws, wks[0]); swaps(nws, sizeof nws / sizeof *nws, wks[1]); //这里有个需要处理的情况 是这周 的 周日 和 下周的周一不能一样 . //如果一样 那么 只对这周处理 将这周日和周六交换 if (ws[6] == nws[0]) { int tmp = ws[6]; ws[6] = ws[5]; ws[5] = tmp; } //返回结果 return ws[wks[2]]; }
对了还有 C中预定义宏,也好复杂,这里不细说了.简单 说一点点
#include <stdio.h> => 直接在 系统路径包含的路径下 找这个文件
#include "sc_head.h" => 现在 当前文件路径下找,找不见去系统包含的路径下找
对于#include 导入的头文件是不区分大小写的.
欢迎交流,拍砖请轻拍,楼主怕伤着.O(∩_∩)O哈哈~