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:很多语法、语言特性可能就是在一系列最佳实践的基础上发现的。笔者日常码代码也有类似的体会: 每一个细节都保持优雅,自然可以发现重构、复用的地方


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

查看所有标签

猜你喜欢:

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

Designing Web Navigation

Designing Web Navigation

James Kalbach / O'Reilly Media / 2007-8-15 / USD 49.99

Thoroughly rewritten for today's web environment, this bestselling book offers a fresh look at a fundamental topic of web site development: navigation design. Amid all the changes to the Web in the pa......一起来看看 《Designing Web Navigation》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具