C语言学习

栏目: C · 发布时间: 5年前

内容简介:代码分拆,再通过编译器 + 方法声明(符号引用) 整合起来:

简介(持续更新)

为什么会有头文件

理解C++中的头文件和源文件的作用

代码分拆,再通过编译器 + 方法声明(符号引用) 整合起来:

  1. 项目大了,一个.c 文件写不下,所以分成好几个.c 文件
  2. a.c 里有一个hello 方法, b.c 怎么知道并使用呢?b.c 可以先声明 有一个hello 方法,根据hello 方法声明找 hello 方法定义的工作交给编译器。编译器在编译b.c的时候会生成一个符号表(symbol table),像“void hello()”这样的看不到定义的符号,就会被存放在这个表中。在进行链接的时候,编译器就会在别的目标文件中去寻找这个符号的定义。
  3. 这里提到了两个概念,一个是“定义”,一个是“声明”。简单地说,“定义”就是把一个符号完完整整地描述出来:它是变量还是函数,返回什么类型,需要什么参数等等。而“声明”则只是声明这个符号的存在,即告诉编译器,这个符号是在其他文件中定义的,我这里先用着,你链接的时候再到别的地方去找找看它到底是什么吧。
  4. 如果hello 方法比较热门,在很多c 文件里都有用到了,那就要多次在使用方那里声明 hello 了。并且,使用hello 方法的人 不一定是hello 的作者,对hello 的声明可能会写错。
  5. 我们可以把hello 声明语句先写好,放在一个文件里,等到 程序员 需要它们的时候,就把这些东西全部copy进他的源代码中。
  6. 头文件便可以发挥它的作用了。所谓的头文件,其实它的内容跟.cpp文件中的内容是一样的,都是 C++的源代码。但头文件不用被编译。我们把所有的函数声明全部放进一个头文件中,当某一个.cpp源文件需要它们时,它们就可以通过一个宏命令“#include”包含进这个.cpp文件中,从而把 它们的内容合并到.cpp文件中 去。当.cpp文件被编译时,这些被包含进去的.h文件的作用便发挥了。

redis 源码的部分体会

带有详细注释的 Redis 3.0 代码(annotated Redis 3.0 source code)

Redis是一个用ANSI C 编写的开源数据结构服务器。Redis的代码非常容易读懂,代码写的很整洁,并且代码量相对较小(4.5w行,其实也不是很小)。大部分都是单线程的,几乎不依赖其它库。

Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, sds 头文件

struct sdshdr {
    int len;
    int free;
    char buf[];
};
static inline size_t sdslen(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->len;
}
static inline size_t sdsavail(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->free;
}
sds sdsnewlen(const void *init, size_t initlen);
sds sdsnew(const char *init);
sds sdsempty(void);
size_t sdslen(const sds s);
sds sdsdup(const sds s);
void sdsfree(sds s);
size_t sdsavail(const sds s);
sds sdsgrowzero(sds s, size_t len);
sds sdscatlen(sds s, const void *t, size_t len);
sds sdscat(sds s, const char *t);
sds sdscatsds(sds s, const sds t);
sds sdscpylen(sds s, const char *t, size_t len);
sds sdscpy(sds s, const char *t);
...

非常优雅的代码,定义一个结构体,包含各种方法,sds 作为大部分方法的第一个参数,以一个 java 开发者的视角来看,这就是在定义一个对象。PS:很多语法、语言特性可能就是在一系列最佳实践的基础上发现的。笔者日常码代码也有类似的体会: 每一个细节都保持优雅,自然可以发现重构、复用的地方


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

More Effective C++(中文版)

More Effective C++(中文版)

梅耶(Scott Meyers) / 侯捷 / 电子工业出版社 / 2011-1-1 / 59.00元

《More Effective C++:35个改善编程与设计的有效方法(中文版)》是梅耶尔大师Effective三部曲之一。继Effective C++之后,Scott Meyers于1996推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“一集”更高阶,尤其是第5章。Meyers将此章命名为技术(tec......一起来看看 《More Effective C++(中文版)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具