c语言命令行编译指令(快速上手系列-C语言之预编译命令)
c语言命令行编译指令(快速上手系列-C语言之预编译命令)2、无参数的宏定义:#define 宏名 字符串1、宏定义3、#include< > 与 #include“ ”#include一般用于头文件的包含,头文件中一般为函数、结构体与全局变量的声明等,#include后跟“”和<>是有区别的:宏定义
上一篇写了C语言中变量的存储类别,提到普通局部变量、普通全局变量和静态局部变量及静态全局变量,这里简单了解一下C语言的预编译命令、宏定义和条件编译。
预编译命令(预编译处理--->编译---->汇编--->连接)
1、预处理:预处理是C语言的一个重要功能,如文件包含、常量定义都属于预处理命令,C语言提供的预处理功能主要有以下三种:
- 1)文件包含 #include
- 2)宏定义 #define
- 3)条件编译 #if #endif
- 4)防止头文件重复包含
2、文件包含处理
- “文件包含处理”是指一个源文件可以将另外一个源文件的全部内容包含进来 C语言提供了#include命令用来实现“文件包含”的操作
3、#include< > 与 #include“ ”
#include一般用于头文件的包含,头文件中一般为函数、结构体与全局变量的声明等,#include后跟“”和<>是有区别的:
- “ ”表示系统先在file1.c所在的目录找file2.c,如果找不到,再按系统指定的目录检索。
- < > 表示系统直接按系统指定的目录检索。
宏定义
1、宏定义
- 在进行文本编辑时,“替换”是一个很有用的功能。C语言编译预处理程序也提供类似的功能:在源程序中,允许一个标识符(称为宏名)来表示一个语言符号字符串。在C语言中,“宏”分为无参数的宏和有参数的宏。
2、无参数的宏定义:#define 宏名 字符串
- 1)宏名一般用大写,以便于与变量区别;
- 2)字符串可以是常数、表达式等;
- 3)宏定义不作语法检查,只有在编译被宏展开后的源程序才会抱错;
- 4)宏定义不是C语言,不在行末加分号;
- 5)宏名有效范围为定义到本源文件结束;
- 6)可以用#undef命令终止宏定义的作用域;
- 7)在宏定义时,可以引用已定义的宏名;
- 8)在头文件中定义的宏,其他源文件只要包含该头文件,同样可以使用此宏定义(对于宏没有声明这一说法)
3、带参数的宏定义:#define 宏名(形参表) 字符串
- 调用:宏名(形参表)
- 宏展开:进行宏替换
- #define S(a,b) a*b
- Area = S(3,2);
- 说明:用3和2分别代替宏定义中的形式参数a和 b,用3*2代替S(3,2)。因此赋值语句展开为:Area = 3*2。
- 对带实参的宏:如S(3,2),按#define命令行中指定的字符串从左到右进行置换。
- 若串中包含宏中的形参(如a、b),则将程序中相应的实参代替形参.
- 如果宏定义字符串中的字符不是参数字符(如a*b中的*号),则保留,这样就形成了置换的字符串
注意:使用带参数的宏定义,最好加上括号,来看个例子:
4、带参数的宏与带参函数的区别:
- 1.函数调用时,先求实参表达式值,再代入形参,而宏只是简单的替换,并不求值;
- 2.函数调用在程序运行时分配内存,而宏展开时并不分配内存,也没有返回值的概念;
- 3.函数中的实参和行参都要定义类型,而且要求一致 宏名无类型,其参数也无类型;
- 4.宏替换不占运行时间,只占编译时间,而函数调用占运行时间。
条件编译
- 1、防止头文件被重复引用
- #ifndef __TEST_H__
- #define __TEST_H__
- #endif
- 如果test1.h、test2.h都引用了test.h,且main.c中同时引用了test1.h,test2.h,那么会出现头文件重复被引用的现象。
- 2、同样的C源代码,条件选项不同可以编译出不同的可执行程序
- 例:
本例是将一行字母字符,根据需要设置条件编译,将字母全改为大写输出,或全改为小写字母输出。
后续送上C语言指针相关内容,想了解的小伙们请关注