快捷搜索:  汽车  科技

c语言命令行编译指令(快速上手系列-C语言之预编译命令)

c语言命令行编译指令(快速上手系列-C语言之预编译命令)2、无参数的宏定义:#define 宏名 字符串1、宏定义3、#include< > 与 #include“ ”#include一般用于头文件的包含,头文件中一般为函数、结构体与全局变量的声明等,#include后跟“”和<>是有区别的:宏定义

上一篇写了C语言中变量的存储类别,提到普通局部变量、普通全局变量和静态局部变量及静态全局变量,这里简单了解一下C语言的预编译命令、宏定义和条件编译。

c语言命令行编译指令(快速上手系列-C语言之预编译命令)(1)

预编译命令(预编译处理--->编译---->汇编--->连接)

1、预处理:预处理是C语言的一个重要功能,如文件包含、常量定义都属于预处理命令,C语言提供的预处理功能主要有以下三种:

  • 1)文件包含 #include
  • 2)宏定义 #define
  • 3)条件编译 #if #endif
  • 4)防止头文件重复包含

2、文件包含处理

  • “文件包含处理”是指一个源文件可以将另外一个源文件的全部内容包含进来 C语言提供了#include命令用来实现“文件包含”的操作

c语言命令行编译指令(快速上手系列-C语言之预编译命令)(2)

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中的*号),则保留,这样就形成了置换的字符串

c语言命令行编译指令(快速上手系列-C语言之预编译命令)(3)

注意:使用带参数的宏定义,最好加上括号,来看个例子:

c语言命令行编译指令(快速上手系列-C语言之预编译命令)(4)

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语言命令行编译指令(快速上手系列-C语言之预编译命令)(5)

c语言命令行编译指令(快速上手系列-C语言之预编译命令)(6)

本例是将一行字母字符,根据需要设置条件编译,将字母全改为大写输出,或全改为小写字母输出。

c语言命令行编译指令(快速上手系列-C语言之预编译命令)(7)

后续送上C语言指针相关内容,想了解的小伙们请关注

猜您喜欢: