C语言扫盲及深化学习 (3)

b. 宏的参数没有类型,所以宏定义的表达式操作可以针对任何满足该操作的类型,而函数必须指明参数类型,即宏是与类型无关的。如下例子:
#define MAX(a,b) (a) > (b) ? (a) : (b) //可以用于任何满足>符号比较的类型值
c.宏参数可以传递类型,而函数不可以。
#define MALLOC(n, type) \ ((type *)malloc((n) * sizeof(type)))
该宏的调用:MALLOC(5, int);

注意:宏后面不要有分号。
由上可知,宏就是原原本本的文本替换,在替换时,一定要把所有的参数都带入替换,避免出现带副作用的宏参数,导致不易察觉的错误出现。

(3)#undef:用于移除一个已经存在的宏定义
(4)条件编译指令
#if constant-expression statements #elif constant-expression statements #else statements #endif
如果constant-expression为非零值,则statements语句被编译,否则被忽略。
(5)条件编译的一大用处是解决多重包含的问题(一个文件被多次包含在一个源文件中),使用方法如下(在头文件中使用):
#ifndef _HEADERNAME_H #define _HEADERNAME_H 1 /*all stuff */ #endif

(6)其他预编译指令:#error、#line、#progma

十九、c语言中的I/O

(1)流的分类:
a.文本流:用于处理文本,一般会对流数据进行格式化处理,以满足文本的处理要求,如在行末添加换行符等。
b.二进制流:不对流数据进行任何改变,保持其在程序或者是在设备/文本中的原本形式,适用于非文本处理。
(2)I/O函数处理数据的三种基本形式:单个字符、文本行、二进制数据,对应的函数/函数族如下所示;
a.单个字符:getchar/putchar
b.文本行:gets/puts(未格式化输入输出)、scanf/printf(格式化输入输出)
c.二进制数据:fread/fwrite

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdpyw.html