C程序的顶层结构
一个C程序由源文件、依赖的库、数据和文档构成,其中源文件又分为两类,一类是头文件(.h),一类是定义文件(.c)。库由源文件编译而来,包含数据和文档,分为静态库和动态库两类。库通过头文件公布其提供的数据和功能。
静态库的编译命令为:
ar cr lib库名.a 目标文件1 目标文件2 ... 目标文件n
动态库的编译命令为:
gcc -shared -fPIC -o lib库名.so 目标文件1 目标文件2 ... 目标文件n
链接静态库或动态库的方式为:
gcc ... -L. lib库名.c
或 gcc ... -L. -l库名
C程序定义文件的结构
定义文件一般包含类型定义、预处理指令、变量声明,变量定义,函数原型、函数定义和注释。由于直接在定义文件中定义的变量在所有函数之外,所以为全局变量。函数定义对应至多一个函数原型。在一个程序中必须有且只有一个定义文件定义main
函数,且main
函数没有原型。每个函数定义都有唯一一个函数体,在函数体中定义的变量为局部变量。函数体中可以包含多条语句。
C程序头文件的结构
C语言的头文件中一般只包括类型定义、处理器指令、函数原型、变量声明和注释等,以支持在多个文件中共享这些信息。
C程序中的语句
C语言中的语句分为复合语句、表达式语句、函数调用语句、空语句和控制语句等5类,其中复合语句同函数体一样,可以包含预处理指令、类型定义、函数原型、变量声明、变量定义和注释,同时符合语句由0到多条语句组成,表达式语句是由表达式后加;
构成,函数调用语句是函数调用后加;
构成,空语句是只有一个;
不执行任何命令的语句,控制语句包括选择、循环控制和跳转三类。
C程序中的表达式和数据类型
C程序的表达式由操作数和运算符组成,根据运算符分为关系表达式、逻辑表达式、算术表达式等。运算符分为算术运算符,赋值运算符、关系运算符、逻辑运算符、条件运算符、逗号运算符和按位运算符,还有sizeof
运算符等。表达式的操作数由函数、常量、变量和子表达式提供。常量、变量和函数等都有相应的类型,在声明、定义变量、函数时都要指定它们的类型。C语言中的类型分为基本类型和复合类型,其中基本类型包括整型、浮点型、字符型和指针等,而复合类型包括数组、结构体、联合和枚举类型,且C语言中的字符串是最后一个字符为\0
字符的字符数组。
C语言的标准库
C语言的标准库包括标准输入输出库、数学计算库、浮点数特性等。其中<stddef.h>
是常用类型定义,包含了一些可用的类型包括ptrdiff_t
,是两个指针相减运算时的结果的数据类型,size_t
是运算符sizeof的返回值类型,wchar_t
是支持国际化的宽字符类型。<stddef.h>
也定义了NULL
宏,同时也定义了offsetof
宏,用以计算结构的起点到指定成员间的字节数。
/****************************************
* using_offsetof.c *
* *
* C语言的seddef.h中的offsetof宏 *
****************************************/
#include <stdio.h>
#include <stddef.h>
struct Test
{
char a;
int b;
float c;
};
int main()
{
printf("a位于结构体类型的%lu字节处\n", offsetof(struct Test, a));
printf("b位于结构体类型的%lu字节处\n", offsetof(struct Test, b));
printf("c位于结构体类型的%lu字节处\n", offsetof(struct Test, c));
return 0;
}
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社