第1章 C语言基础
1. 概念
C是很小的内核语言,并包含极少的硬件相关元素,可以说具有相当高的可移植性 。比方说,C语言不提供有关文件操作或动态内存管理等语句。事实上,甚至不直接提供控制台输出和输入语句。C语言的做法是是使用扩充的标准C链接库,为各式各样的编程目的提供各种所需的函数。
因为C是专门作为“系统编程”而开发的,它目前主要的用途之一就是编写”嵌入式系统程序“,这一点不会让我们感到惊讶。许多开发者把C当作可移植的,结构化的高级程序语言,以编写诸如文字处理器、数据库以及图形应用程序。
第7章 函数
一个源文件就是一个翻译单元。前面说过#include指令只是将文件的内容插入到#include指令的位置,比如这样的代码也是可以的:#include "mydoc.txt"或者#include "mycsource.c"但是这样写出的代码有点怪异,所以这里我们按照一般的概念,编译源文件(.c文件),#include头文件(.h文件)。确切的说,一个翻译单元就是一个源文件和它include的头文件。 一个翻译单元编译成一个目标文件,最后将多个翻译单元连接起来生成一个完整的可执行程序。
1. inline函数
和其他函数不同的是,翻译单元只要用到某个inline函数,就必须重复定义此inline函数,编译器必须准备好此函数,以便插入inline的程序代码,因此,inline函数定义经常被写入在头文件中。
如果翻译单元内的某个函数的所有声明都具有inline修饰符,而没有extern修饰符,那么此函数是inline的。inline定义特别针对翻译单元,它不构成外部的定义,因此别的翻译单元可以包含此函数的外部定义。如果有外部定义附加到inline定义中,那么编译器可以只有选择要使用哪一种定义。
如果使用存储类修饰符extern来声明一个被定义成inline的函数,那么此函数的定义就会是外部的(external)。
然而从别的翻译单元调用函数,将不会被编译成inline。inline函数其实就是一般的函数,只不过在机器码中被调用的方式不同。和一般的函数一样,inline函数具有自己的地址。如果inline函数使用到宏,此处也是展开宏。然而,在没有被声明为static的inline函数,你不应该以静态生存周期的方式来定义可修改的对象。
2. 可选性自变量
这是C语言中对于具有可变参数的函数的支持。
具体要使用这些可变的参数的时候,必须通过一个类型为va_list的对象,它包含了这些参数。该类型定义在stdarg.h中。
可以使用stdarg.h中的4个宏来处理这个指针。
void va_start(va_list argptr,lasparam)
type va_arg(va_list argptr,type)
void va_end(va_list argptr)
void va_copy(va_list dest,va_list src)
第11章 声明
1. 外部链接
具有外部链接的标识符,表示整个程序内部都是相同的函数或对象。编译器会将这种标识符交给连接器(linker),由连接器解析(resolve)这类标识符,并且把其他翻译单元和链接库中的相同标识符链接起来。
在声明函数和对象标识符的时候&#
1. 概念
C是很小的内核语言,并包含极少的硬件相关元素,可以说具有相当高的可移植性 。比方说,C语言不提供有关文件操作或动态内存管理等语句。事实上,甚至不直接提供控制台输出和输入语句。C语言的做法是是使用扩充的标准C链接库,为各式各样的编程目的提供各种所需的函数。
因为C是专门作为“系统编程”而开发的,它目前主要的用途之一就是编写”嵌入式系统程序“,这一点不会让我们感到惊讶。许多开发者把C当作可移植的,结构化的高级程序语言,以编写诸如文字处理器、数据库以及图形应用程序。
第7章 函数
一个源文件就是一个翻译单元。前面说过#include指令只是将文件的内容插入到#include指令的位置,比如这样的代码也是可以的:#include "mydoc.txt"或者#include "mycsource.c"但是这样写出的代码有点怪异,所以这里我们按照一般的概念,编译源文件(.c文件),#include头文件(.h文件)。确切的说,一个翻译单元就是一个源文件和它include的头文件。 一个翻译单元编译成一个目标文件,最后将多个翻译单元连接起来生成一个完整的可执行程序。
1. inline函数
和其他函数不同的是,翻译单元只要用到某个inline函数,就必须重复定义此inline函数,编译器必须准备好此函数,以便插入inline的程序代码,因此,inline函数定义经常被写入在头文件中。
如果翻译单元内的某个函数的所有声明都具有inline修饰符,而没有extern修饰符,那么此函数是inline的。inline定义特别针对翻译单元,它不构成外部的定义,因此别的翻译单元可以包含此函数的外部定义。如果有外部定义附加到inline定义中,那么编译器可以只有选择要使用哪一种定义。
如果使用存储类修饰符extern来声明一个被定义成inline的函数,那么此函数的定义就会是外部的(external)。
然而从别的翻译单元调用函数,将不会被编译成inline。inline函数其实就是一般的函数,只不过在机器码中被调用的方式不同。和一般的函数一样,inline函数具有自己的地址。如果inline函数使用到宏,此处也是展开宏。然而,在没有被声明为static的inline函数,你不应该以静态生存周期的方式来定义可修改的对象。
2. 可选性自变量
这是C语言中对于具有可变参数的函数的支持。
具体要使用这些可变的参数的时候,必须通过一个类型为va_list的对象,它包含了这些参数。该类型定义在stdarg.h中。
可以使用stdarg.h中的4个宏来处理这个指针。
void va_start(va_list argptr,lasparam)
type va_arg(va_list argptr,type)
void va_end(va_list argptr)
void va_copy(va_list dest,va_list src)
第11章 声明
1. 外部链接
具有外部链接的标识符,表示整个程序内部都是相同的函数或对象。编译器会将这种标识符交给连接器(linker),由连接器解析(resolve)这类标识符,并且把其他翻译单元和链接库中的相同标识符链接起来。
在声明函数和对象标识符的时候&#