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预处理命令


发布了46 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41850194/article/details/105315802