在项目中或者开源代码中,有很多很实用的 C 代码,总结在此,方便复用。
UNUSED_VARIABLE
项目中对暂未使用的变量使用 UNUSED_VARIABLE (var); 来处理 “warning: unused parameter ‘arg’ [-Wunused-parameter]” 警告。
1 |
编译时的参数检查
1 |
直接在宏的定义处检查其是否合法,如不合法,使用 #error
中止编译,打印出错误信息。
#define
定义一个宏,#undef
删除宏定义。
开关状态切换替代语句
使用条件运算符在两种状态之间切换:
1 | void onoff() {state = (state == ON) ? OFF : ON; } |
使用异或和赋值运算替换上述代码:
1 | void onoff() {state ^= 1; } |
C++调用C头文件声明
extern "C"
的作用是让 C++ 编译器将 extern "C"
声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。
在 C++ 中所有使用 C 实现的函数声明都需要使用如下声明包含。
1 |
|
C 输入输出格式化
输出
1 | // man 3 printf |
所有适用于 printf 的 format 形式都适用于 fprintf、dprintf、sprintf、snprintf。
printf
原型:
1 |
|
示例:
1 |
|
输出:
1 | char: A |
格式修饰符:
- -:左对齐。
- +:输出符号(正数前面加上“+”)。
:八进制前缀(0)、十六进制前缀(0x 或 0X)或浮点数小数点(.)。
- 0:用 0 在左侧填充数据输出的空白,而不是默认的空格字符。
- m.n:m 是指定的最小宽度,n 是指定的精度。
- *:用来接收动态传入的宽度和精度。例如,%*.*f 表示输出浮点数,宽度和精度由后面带两个 int 类型的参数动态传入。
输入
1 | // man 3 scanf |
scanf
原型:
1 |
|
scanf()函数根据由 format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数。
scanf()读取匹配 format(格式)字符串的输入。当读取到一个控制字符,它把值放置到下一个变量。空白(tabs,空格等等)会跳过。非空白字符和输入匹配,然后丢弃。如果是一个在%符号和控制符间的数量,那么只有指定数量的字符转换到变量中。如果scanf()遇到一个字符集(用%[]控制字符表示),那么在括号中的任意字符都会读取到变量中。scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF。
示例:
使用 sscanf 编写示例,可以直接使用 str 作为输入,免于手动输入,更加直观。
1 |
|
格式字符说明:
%a,%A 读入一个浮点值(仅C99有效)
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x,%X 读入十六进制整数
%c 读入一个字符
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
类型修饰符:
类型修饰符 | 说明 |
---|---|
h | 表明转换符将是d,i,o,u,x,X或n的其中一个,而且其后的参数是一个指向short int或unsigned short int(而不是int)的指针。 |
hh | 类似h,但是其后的参数是一个指向signed char 或 unsigned char的指针 |
j | 类似h,但是其后的参数是一个指向intmax_t 或 uintmax_t的指针 |
t | 类似h,但是其后的参数是一个指向ptrdiff_t的指针 |
z | 类似h,但是其后的参数是一个指向size_t的指针 |
l | 1、表明转换符将是d,i,o,u,x,X或n的其中一个,而且其后的参数是一个指向long int或unsigned long int(而不是int)的指针2、表明转换符将是e, f,或g的其中一个,而且其后的参数是一个指向double(而不是float)的指针3、指定两个l,和L一致。 |
L | 1、表明转换符将是e, f, 或 g的其中一个,而且其后的参数是一个指向long double的指针2、表明转换符是d, i, o, u,或x的其中一个,而且其后的参数是一个指向long double的指针 |
根据示例,类型修饰符在实现中会有具体的表现,需要在实际环境中测试。
回调函数(callback)
简单示例:
1 |
|
使用系统工具获取文件MD5值的C++代码
程序依赖于系统命令 md5sum。
1 |
|
Monitor 程序模板
1 | /* |