欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux C程序 预处理命令

程序员文章站 2022-06-02 22:42:32
...

第八章  预处理命令

1.1宏定义

   C语言标准允许在程序中用一个标识符来表示一个字符串,成为宏。标识符为宏名,在编译预处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。宏定义是由源程序中的宏命令完成的。宏替换是由预处理程序自动完成。宏分为两种:无参数宏和有参数的宏。

1.1.1无参数宏

无参数宏定义的一般形式为:

#define 标识符字符串

“#”代表本行是编译预处理命令。define是宏定义的关键词,标识符是宏名。字符串是宏名所代替的内容,可以是常数,表达式等。

注意:宏定义和其他编译预处理命令不是以分号结尾的。

例:使用无参数宏的程序,输入半径,求圆的半径,求圆的周长和圆的面积。Linux C程序 预处理命令

1.1.2有参数宏

有参数的宏类似于有参数的函数,其定义的一般形式为:

#define 标识符(形参表)字符串

如果有多个形参,像函数参数一样以逗号隔开。在程序中使用有参数宏的形式是:

标识符(实参表)

例:演示参数的实现方法

Linux C程序 预处理命令

注意:有参数宏只是符号替换,不存在值传递。

1.1.3预处理判断

(1)

Linux C程序 预处理命令

如果上面没有定义_A_,那么使用_A_(5.1415926),如果上面定义了_A_,使用_A_(3.1415926)。

Linux C程序 预处理命令

(2)

Linux C程序 预处理命令

如果上面定义了_A_,使用_B_,输出_B_。

1.1.4知识点:宏定义与函数的区别。

(1)宏定义只是对字符串进行简单替换,而函数调用则是按程序的含义来替换形式参数。

(2)宏定义只能用于简单的单行语句替换,而函数可用于负责运算。

(3)宏定义只占用编译时间,不占用运行时间,执行速度快,而函数调用,参数的传递等,都要占用内存开销。

(4)宏定义在编译时展开,多次使用会让源程序增大,而函数调用不管多少次总占用相同的源程序空间。

(5)宏的作用范围从定义点开始,到程序文件的末尾或使用命令#undef取消定义之前。

(6)有参数的宏的形式参数不是变量,不分配内存空间,无需说明数据类型。而函数的形式参数是变量,需要分配内存空间,在函数定义时要指明参数的数据类型。

注:undef 是终止宏定义的特定字,其作用是从该命令开始,该表示符(宏名)不再代表相应字符序列,即该标识符的作用范围到此处结束。

2.1文件包含

文件包含是指把指定源文件的全部内容包括到当前源程序文件中。

文件包含命令的一般形式为:

#include "文件名"
或
#include <文件名>

(1)文件包含命令中的文件名即可以用尖括号,也可以用双引号括起来,它们的区别在于查找指定文件的位置不同。

尖括号只在缺省目录里找到指定文件。

双括号则先在源程序文件所在的当前目录里查找指定文件,如果没有找到再到缺省目录里找。

(2)文件包含预处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入该命令行位置取代该命令行,从而指定的文件和当前的源程序文件练成一个源文件。

(3)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。

(4)文件包含允许嵌套,即在一个被包含的一个文件中又可以包含另一个文件。

3.1条件编译

条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理——满足条件时编译某些语句,不满足条件是编译另一些语句。

一般情况下,源程序中所有的行都被编译,有时希望其中一部分内容只在某个条件成立或不成立时才去编译,也就是对一部分内容制定编译的条件,这就是条件编译。

预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。

条件编译分为6种模式:

(1)

#ifdef 标识符
    程序段1
#endif
它的含义是:如果定义了标识符,就编译程序段1,否则就不编译该程序段。

(2)

#ifndef 标识符
     程序段1
#else
     程序段2
#endif

它的含义是:如果没有定义表示符,就编译程序段1,否则就编译程序段2。

(3)

#ifndef 标识符
    程序段1
#endif

它的含义是:如果没有定义表示符,则编译程序段1.

(4)

#ifdef 标识符
    程序段1
#else
    程序段2
#endif

它的含义是:如果定义了标识符,就编译程序段1,否则编译程序段2。

(5)

#if 表达式
    程序段1
#endif

他的含义是:如果表达式成立,则编译程序段1,否则不编译该程序段。

(6)

#if 表达式
   程序段1
#else
   程序段2
#endif
它的含义是:如果表达式成立,就编译程序段1,否则编译程序段2。