好久以前刚开始学习前辈们的代码的时候,发现好多代码感到好奇怪.

      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();
heoo(,1.00,"");

现在应该理解了,对于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+);
}

这样的写法 是 函数定义部分,返回值占一行 ,是 为了 突出 函数返回值得重要性

还有下面的写法

void heoo(int age)
{
printf("age = %d.\n",age);
}

上面是函数 声明 + 定义 两部分组成的. 应用场景有 如下

static int __getid(void)
{
static int __id = ;
++_id;
return __id;
}

对于静态函数作用域只在当前文件,一般放在 *.c 文件下.那么就不需要声明.

就可以将声明和定义放在一起写.

3.关于其它语法的写法  

  1) 关于 if 语句

//第一种 if
if(age > )
puts("年龄不小了!"); //第二种if
if(age < ){
age = ;
puts("别乱搞行吗!");
} //第三种
if(age > ){
puts("age is %d");
exit(EXIT_FAILURE);
}
else {
age = -;
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 = ;i<;++i)
i*=; //第二种写法
for(i=;i<;++i){
i*=;
printf("i=%d\n",i);
}

同样while语句也是这样写的.

  3).关于switch 语句

switch(type){
case :
puts("hello ");
break; case :
puts("world ");
break; default:
printf("type =%d fatal error!\n",type);
exit(EXIT_FAILURE);
}

4)关于goto 语句

//goto 使用方法,在项目较大的时候,还是必须要使用的

  for(int i=;i<;++i){
for(int j=;j<;++j){
if(i+j == )
goto __hl_puts;
}
....
} __hl_puts:
puts("就这样");

4.扩展总结

  到这里基本上关于C代码的书写基本就这样的,但也只是一个简单的开始.因为C的历史很悠久,悠久的历史中有过很多 天才创造出 优秀的范式.例Unix风格,Linux风格,Windows风格等等

上面的范式主要还是Linux C开发风格.外加自己的一些简单理解.

下面 再 说一些 其它,仅供参考.

//全局变量声明
int g_age = ; //静态变量声明
int __age = ; //唯一宏判断
#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[]; //先获取 当前 周 的周日 距离 这年开始 是多少天
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[] = year * + yd - wd + _INT_WKS; //继续获取 下一周的 周不变量
wks[] = wks[] + _INT_WKS; //将其索引变成 [1,2,3,4,5,6,0] => [0,1,2,3,4,5,6]
wks[] = (wd + _INT_WKS - ) % _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 = ;
srand(rk); int i = ; //测试通过
for (;i< ;++i)
printf("%d, ",rand()%);
putchar('\n'); srand(rk);
for (i=;i < ;++i)
printf("%d, ", rand() % );
putchar('\n'); return ;
} //将 数组 a[]中数据打乱,按照种子rk来打乱
void
swaps(int a[], int len, unsigned rk)
{
int i = -;
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[] = { ,,,,,, }, nws[] = { ,,,,,, }; //现在 我们 获取 了 这周的种子wkd 和 下周的种子nwkd
int *wks = __getwks(); //开始初始化
swaps(ws, sizeof ws / sizeof *ws, wks[]);
swaps(nws, sizeof nws / sizeof *nws, wks[]); //这里有个需要处理的情况 是这周 的 周日 和 下周的周一不能一样 . //如果一样 那么 只对这周处理 将这周日和周六交换 if (ws[] == nws[]) {
int tmp = ws[];
ws[] = ws[];
ws[] = tmp;
} //返回结果
return ws[wks[]];
}

对了还有 C中预定义宏,也好复杂,这里不细说了.简单 说一点点

  #include <stdio.h> => 直接在 系统路径包含的路径下 找这个文件

#include "sc_head.h" => 现在 当前文件路径下找,找不见去系统包含的路径下找

对于#include 导入的头文件是不区分大小写的.

欢迎交流,拍砖请轻拍,楼主怕伤着.O(∩_∩)O哈哈~

C 的 一些写法格式 交流的更多相关文章

  1. AMD,CMD,UMD 三种模块规范 写法格式

    一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 // 文件名: foo.js define(['j ...

  2. python time和datetime常用写法格式

    python 的time和datetime常用写法 import time from datetime import datetime from datetime import timedelta # ...

  3. 浏览器兼容性判定写法格式(ie)

    条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]> <!- ...

  4. image的路径写法格式

    if (MapGrid.Visibility == Visibility.Visible) {      this.MapGrid.Visibility = Visibility.Collapsed; ...

  5. 学习Vue第一节,Vue的模式与写法格式

    引用Vue <script src="js/vue-2.4.0.js" type="text/javascript" charset="utf- ...

  6. sql 写法注意点

    a.CRUD(create,read,update,delete)操作方法写法格式 字段格式要个数据库表字段一致,字母不区分大小写,支持下划线. 例如: screenName or scrEenNam ...

  7. 跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式

    问题描述 在 C/C++ 开发中,使用 printf 打印 64 位变量比较常用,通常在 32 位系统中使用 %lld 输出 64 位的变量,而在 64 位系统中则使用 %ld: 如果在 32 位系统 ...

  8. 201621123040《Java程序设计》第2周学习总结

    1.本周学习总结 关键词:Java中的字符串与数组 c语言基本语法的迁移 相关总结:在一周的学习过程中,我自主学习Java的基本语法,前期的相关语法与c语言的基本语法相近,也算是做到了很好的回顾:在郑 ...

  9. 《Ansible权威指南》笔记(4)——Playbook

    七.Playbook1.语法特性如下:(1)"---"首行顶格开始(2)#号注释(3)缩进统一,不同的缩进代表不同的级别,缩进要对齐,空格和tab不能混用(4)区别大小写,键值对k ...

随机推荐

  1. android EditText 只允许输入指定字符

    实现只允许只入数字和字符 方法一:在XML文件中实现布局如下: <EditText android:layout_width="match_parent" android:l ...

  2. maya user guider第一课,一些基本概念

    1.maya主要用于建模,动画, 视觉特效,游戏, 和模拟 一般分为以下几类: l  建模: ploygons, nurbs, subdivision surfaces   这是不同的建模方法. po ...

  3. (Loadrunner)Abnormal termination, caused by mdrv process termination.(转)

    Load generator跑了太多用户导致CPU和内存爆满,进程无法处理请求 确认自定义的代码是否释放内存 合理调整或增加思考时间 关闭extended log 尽量避免使用Load generat ...

  4. Laxcus大数据管理系统2.0(11)- 第九章 容错

    第九章 容错 在当前,由于集群庞大的组织体系和复杂性,以及用户普遍要求低成本硬件,使得集群在运行过程中发生的错误概率,远远高于单一且性能稳定的小型机服务器,并且集群在运行过程中几乎是不允许停止的,这就 ...

  5. JFrame 不规则窗体

    效果截图: 这几天静心学java,由于学的不是很好,也没有什么有什么可以作品,但是毕竟也算刚开始认真学,也遇到了好多问题: 首先 1. JFrame的无边框设置:JFrame.setUndecorat ...

  6. noi2010 能量采集

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 3068  Solved: 1820 [Submit][Sta ...

  7. java基础回顾(二)——内部类

    一.常规内部类 public class Outer { int count; void say(){ count++; System.out.println("我是外部类"); ...

  8. tool debug Android phonegap app

    phonegap debug 最近发现了一个可以调试phonegap的工具  在Google浏览器上调试Android真机的APP  这是好啊!!!跟Mac上的Safari 浏览器一样调试iOS 的A ...

  9. linux 内存使用

    # df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 1.9G 45G 5% / tmpfs 1.9G 0 1.9G 0% ...

  10. Qt事件处理机制

    研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...