C语言基础-预编译指令
预编译指令(编译器实现,不是C语言内容)
主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等
何时需要预编译:总是使用不经常改动的大型代码体。
预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
#define宏
宏定义不存在类型问题,它的参数也是无类型的。只进行字符替换,没有类型安全检查。
写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
C语言和C++默认将NULL替换为0
1)集成化的调试工具不能对宏常量进行调试。
2)只做简单的替换,不自动加括号
3)宏定义不可以嵌套。
4)字符串" "中永远不包含宏。
5)宏定义不分配内存,变量定义分配内存。
宏函数,替换成宏参数的相应语句,不再是简单的字符串替换:
#define SQR(X) X*X
SQR(2+1):返回2+1*2+1 也就是5
SQR(2+1)/SQR(2+1) : 返回 2+1*2+1/2+1*2+1 返回7.5
#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。
自动区分参数运算与替换(当不为参数名和运算符时,字符替换不能替换成运算符)
#define SQR(X) X*X
SQR(1)替换成1
#define SQR(X) XY
SQR(任何数)替换成XY
#define STR(arg) #arg
宏STR(hello)展开时为”hello”
#define NAME(y) name_##y
宏NAME(1)展开为name_1
#undef:取消宏定义
#ifdef:如果宏已经定义
assert()宏
assert()是一个定义在<assert.h>的宏(也就是在头文件中define的)。
接受一个布尔值,若为真(非0)则继续执行;为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行
#include引入头文件、#if条件编译
头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含
例如,为避免头文件my_head.h被重复包含,可在其中使用条件编译:
条件编译(编译预处理中的条件命令):
#ifndef _MY_HEAD_H //如果该宏没有被定义
引入头文件
#define _MY_HEAD_H /*空宏*/ //定义空宏,就是定义成了空白符,用作标志
#elif
#else
#endif #终止#if预处理命令