跳转至

C 模块

单独的一个.cpp文件为一个编译单元。

函数

函数声明

函数可以在全局声明也可以在函数中声明。在函数中声明的函数在全局有效。函数在调用前需要先声明。

「C语言特性」函数可以声明为无参数(void)或不确定参数(参数列表为空)。

内联函数inline

  1. 选择两者其一即可:在函数声明前附加inline,在函数定义前附加inline
  2. 可将内联函数放置于头文件中;同一个函数的所有内联定义都必须相同。

函数原型

retrunType functionName(paremeterType parameter);

函数原型中函数的参数可以省略变量名。

头文件与实现文件

头文件与实现文件分离时,遵循**自给自足原则**和**包含防护原则**。

包含防护(guarding)

#ifndef THIS_HEADER_H_
#define THIS_HEADER_H_
// 类的定义

#endif  // THIS_HEADER_H_

储存类、链接和内存管理

作用域

  • 代码块作用域
  • 函数原型作用域(如VLA)
  • 函数作用域(仅适用于goto语句使用的标签)
  • 文件作用域(全局变量)

链接

  • 外部链接
  • 内部链接(在外部定义中使用了储存类说明符static
  • 空连接

储存时期

  • 静态储存时期
  • 动态储存时期

自动变量不会被自动初始化。外部变量只能使用常量表达式来初始化。(只要类型不是一个数组,sizeof()就是一个常量表达式)

使用register关键字声明寄存器变量。

如果变量在其他文件声明,必须使用extern关键字来声明。

malloc()free()

double * ptr = (double *)malloc(n * sizeof(double)); 成功分配内存则返回一个指向第一个分配内存空间的指针,否则返回空指针。应当显式地进行类型指派。

free(ptr); 释放占用的内存空间

malloc() 的等价语句是 calloc()

double * ptr = (double *)calloc(n, sizeof(double)); 返回值与 malloc() 相似。

realloc(ptr, n * sizeof(double)) 可用于重新分配内存空间,ptr指向的空间需由malloccalloc或者realloc分配,且不需要**也不能**调用free

CV限定符和restrcit限定符

const

volatile

当变量除了被程序改变之外还可能被其他代理改变时。一个变量可以同时是 constvolatile

restrict

只用于指针,表示该指针是访问数据块的唯一方式。

在函数原型中,参数的 restrict 要求保证指针是它指向的内容的唯一的访问方式。 void * memcpy(void * restrict s1, const void * restrict s2, size_t n);void * memmove(void * s1, const void * s2, size_t n); memcpy() 要求两个位置之间不重叠, memmove() 允许重叠。

static

double stick(double ar[static 20]);

函数原型中的 static 表示数组至少具有20个元素。

在函数原型中CV限定符的等价形式

void ofmouth(int * const a1, int * restrict a2, int n);
void ofmouth(int a1[const], int a2[restrict], int n);  // 与上一句等价。