预处理器是那些在编译过程开始前就有我们的源代码的程序。这些预处理器包含一些指令,如#define,#include,等等。总共有4种主要的预处理器指令。其中之一是宏。宏包含程序中的一段代码,它被赋予一个特定的名称。当编译器遇到这个名字时,编译器会用真正的/实际的代码替换这个名字。'#define'指令定义了一个宏。
宏是一种缩写,代表编程语言中的某段代码。这些宏有助于简化和减少代码,以避免冗余和重复的编码。这样就可以减少因重复编码而产生的错误。关于宏的主要优点是,它可以转换代码,使汇编程序更容易阅读。
宏的扩展
一个宏包含一个名称,一组形式参数,和代码的主体。宏的名称与参数集一起使用,并由其主体产生的一些代码所取代。这就形成了一个宏的扩展。这允许程序员创建和定义伪操作,那些可取的操作和那些没有实现为处理器指令的操作。宏有一个特殊的品质,它可以自动编写程序。宏的名字是作为代码中的一个关键词来写的。它作为对该特定宏的调用,就像一个函数调用。然后这个名字被一些其他的宏体代码所取代,正如我们上面所描述的。这种用处理后的副本替换调用的方式就是宏调用的扩展。它在C语言和C ++语言中都有使用。
一旦定义了一个宏,我们就不能在不删除第一个原始定义的情况下将其重新定义为一个不同的值。但可以用已经定义的宏的相同定义来重新定义宏。#undef指令负责删除一个宏的定义。一旦定义被删除,我们就可以用不同的值重新定义宏了。
C++中的宏
有两种类型。
- 类似对象的宏
- 类似函数的宏
类似对象的宏
类似对象的宏不需要任何参数。这些是被值所取代的标识符。它们主要用于表示数值和常量。
#definePl3.17
Pl是宏的名称,它将被3.17这个值所取代。
类似函数的宏
这些类型的宏可以接受参数。这些宏看起来像一个函数调用。例如,举个例子,Max是宏的名称。
#defineMax(a,b) ((A)< (b)?(a): (b))
宏通常不产生函数调用。在C++中,内联函数是最好的。
预定义的宏
微软C/C++编译器,有MSVC预定义的宏,取决于C++语言、编译目标和编译器选项。MSVC支持ANSI/ISO C99标准要求的预定义预处理器宏。这些预定义的宏不使用参数,也不能被重新定义。
许多预定义的宏可以在C/C++源代码/程序中使用。这里描述的是其中一些最常用的。
__Date__
文件中程序的编译日期由这个函数宏表示。日期是一个月-日-年格式的字符串,是一个常量值。这种类型的宏总是被定义的。
__时间__
它描述了被预处理的单元的翻译时间。与date类似,它有一个特定的格式,即写成小时:分钟:秒,与返回时间的方式相同。
这种类型的宏也总是被定义。
__File__
这表示当前文件的名称。它扩展为一个字面的字符串。这确保了通往该文件的路径被显示出来。它是一个总是被定义的宏。
__Line__
它代表当前源文件的整数格式的行号。这个宏和其他宏一样被定义,它的值在#line的帮助下被改变。
现在我们将强调一些__line__C++宏函数的例子。
__Line__
为了了解这个宏的工作原理,这里我们引用了一个例子。首先,我们使用了一个输入和输出流的库。然后,我们使用了一个维护错误日志的函数error log。这个函数有一个参数,可以接受字符串形式的行和信息。这个函数将显示从主程序传递给宏的带有消息的行号。
#defineLOG(msg)errorLog(__LINE__, msg)
之后,我们定义了一个宏。这将接受来自主函数的消息行字符串,当这个宏被调用时,主函数已经作为一个参数传递过来。同样地,错误日志函数也是以行宏和消息作为参数调用的。该文件将以.c源代码文件的扩展名保存。由于我们要看到Linux平台的结果,所以到终端应用命令来编译和执行该文件。使用C++的g++编译器。
./f
你可以看到,即使有空格,行号也是通过行宏识别的。从这个例子中,你已经看到了__line__宏的功能。但在下一个例子中,所有的宏在程序中都是集体的。我们使用了'cout'来打印行。每一行都包含一个不同的宏,并显示该值。例如,对于日期,我们使用了。
Std:: cout<<("Date :%s\n", __Date) <<std ::endl。
现在我们将看到输出。你可以看到,文件名、编译日期、编译时间和当前行号通过每个宏的一段代码就能非常有效地显示出来。
宏的用途/优点
- 占用空间少,因为它将长变量的声明转换为短变量。
- 当使用宏的名称为当前语句提供意义时,比起长代码更容易理解宏的内容。
- 宏并不能自行清理或清除垃圾等。这取决于程序员,他决定宏的设计何时退出和要求清理,以便第二个文件可以轻松使用宏。
- 程序的执行速度提高了,这是代码中使用宏的一个主要优点。
结论
_line__C++ 宏 "是一篇文章,通过描述宏的类型和预定义的宏以及进一步描述它们的类型来阐述宏的基本功能。所有这些功能都在一个例子的帮助下得到了解释。宏很容易实现,在编译代码时需要较少的时间。这些功能是由那些想在基础源程序中使用一小段代码来创造创新和条件的程序员设计的。为了这个目的,文章最后附有宏在源代码中的用途,并描述了它们在某些方面的好处。