前言:
C语言用过两年了,但并没有系统的看过参考文档,这段时间闲来无事,就系统地看了一边,对以前比较陌生的地方,在这里记下来,以供以后参考。
1、assert (assert.h)
这是一个宏,调试时使用,如果条件为假,则输出当前文件名和行号,然后退出程序。
#define NDEBUG #include <assert.h>取消debug功能
2、宏
宏是在一行上定义的,'\' 续行符可以形式上在多行上书写。所以__FILE__, __LINE__可以准确反映是在哪个文件的哪行。先进行宏展开,再进行编译。
#define DBG(msg) \ printf("%s[%s:%d]",msg,__FILE__,__LINE__) DBG("hello world"); //这行代码在哪一行,输出信息中就写着哪一行。3、errno
errno是一个局限于线程的全局的变量,当系统调用出错时,他们会设置此变量,表明是因为什么原因出错的。如果系统调用正常,不保证设置errno为0(success)。
strerror和perror函数可以得到errno变量的字符串描述
4、不咋使用的头文件
ciso646.h,提供了与,或,异或的别名,个人感觉还是符号比较清楚,所以这东西没必要使用。
limits.h定义了char,short,int,long有无符号的最大和最小值,但实际的值取决于系统和编译器,所以这头文件也没用。
setjmp.h,可以是面向过程的C语言,有跳来跳去的功能。这个东西会是我的思路不清晰,还是不要用了
5、setlocale
迄今仍然不会使用
6、stdarg.h
可变参数列表,很酷的功能,以前畏惧,不敢学,不会用。唉,当时的自己真差劲。
#include <cstdarg> #include <iostream> using namespace std; void f(int n,...) { //这只是个示例。最后一个命名变量应该包含可变变量数量,类型的信息。如printf va_list vl; va_start(vl,n); //宏,使vl和最后一个命名变量关联 int i = va_arg(vl,int); //根据变量类型(这里是int)做地址偏移,取出变量值 char *s = va_arg(vl,char*); cout << "int: " << i << endl << "char*:" << s << endl; va_end(vl); //宏嘛,配对的 } int main() { char str[] = "hello"; f(3,12345,str); return 0; }7、stdbool.h
C不支持bool类型,C99引入此头文件。此文件定义了一些宏,来支持bool运算。
#define true 1 #define false 08、stddef.h
9、stdio.h
char * gets ( char * str );char * fgets ( char * str, int num, FILE * stream );gets和fgets不一样,gets从stdin读数据,直到newline or the end-of-file reached,不保留newline符号。fgets可以指定输入流,str大小,且保留newline符号。相同点是两者都会在str结尾加入'\0'
10、stdlib.h
char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff"; char * pEnd; long int li1, li2, li3, li4; li1 = strtol (szNumbers,&pEnd,10); li2 = strtol (pEnd,&pEnd,16); li3 = strtol (pEnd,&pEnd,2); li4 = strtol (pEnd,NULL,0); printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
参考:www.cpluscplus.com