「C语言笔记」杂项
这里记录着一些C语言写程序过程中容易忘记的东西。
持续更新中…
最后更新时间: 2023-5-10
关于时间
使用<sys/time.h>和gettimeofday(struct timeval*, void *)
返回自1970年1月1日UTC时间00:00:00起经过的时间,第一个变量为传入时间的指针,结构为
1 | struct timeval |
使用<time.h>和clock(void)
返回自程序开始执行以来的时钟滴答数。如果将其除以常数CLOCKS_PER_SEC,将获得程序在CPU中已运行多长时间(以秒为单位)。
代码示例
以1到1000,000,000求和为例
1 | //file: tictoc.h |
1 | //file: gettime.c |
函数重载
C语言本身没有函数重载,一种简单的实现办法如下
1 |
|
宏替换的结果为
1 | FOO(1) => FOO1(1) |
声明优先级
- 声明 从它的名字开始读取,然后按照优先级顺序依次读取。
- 优先级从高到低依次是:
- 声明中被圆括号括起来的那部分
- 后缀操作符:
- 圆括号
()
表示这是一个函数 - 方括号
[]
表示这是一个数组
- 圆括号
- 前缀操作符:星号
*
表示“指向…的指针”
- 如果
const
或volatile
关键字的后面紧跟类型说明符(如int
,long
等),那么它作用于类型说明符,在其他情况下,const
或volatile
关键字作用于它左边紧邻的指针星号。
例子
1 | char * const *(*a)(); |
- 先看名字:
a
,说明这是一个名为a
的变量; - 圆括号优先级最高,里面
a
被星号*
修饰,说明变量类型是指针; - 后缀圆括号
()
优先级比星号*
高,说明这是一个函数指针; - 再看
(*a)()
的前缀星号*
,说明这是一个函数指针,所指函数的返回类型为指针; - 再看最左边的类型
char * const
,const
关键字修饰左边的星号*
,说明函数返回类型是一个指向常量指针的指针; - 最后看最前面的
char
,说明该常量指针是一个指向字符的常量指针。
全部连起来就是:声明一个函数指针变量a
,所指函数返回一个指向字符型常量指针的指针。
我们再看看著名函数signal()
的声明:
1 | void (*signal(int sig, void (*func)(int)))(int) |
- 先看圆括号括起来的部分
(*signal(...))
,后缀圆括号()
比前缀*
的优先级高,说明这是一个函数,其返回类型为指针,其名为signal
; - 再看函数的参数列表
(..., ...)
,说明参数有两个:- 第一个参数是整型,声明为
int sig
, - 第二个参数比较复杂,声明为
void (*func)(int)
,可以看出这是一个指针,指向返回值为void
,参数列表包含一个整型。
- 第一个参数是整型,声明为
- 我们再来看返回类型的指针所指为何,第一部里的圆括号
void (...)(int)
外面的后缀圆括号(int)
优先级最高,说明返回类型是函数指针,所指函数其参数列表为一个整型,无返回值;
连起来就是:声明一个函数signal
,signal
返回一个函数指针,这个函数指针指向一个传入一个整型的void类型的函数,signal
需要传入两个参数,第一个是整型(信号),第二个与signal
的返回类型相同,是指向传入一个整型的void函数的指针。