亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 预处理器

预处理器是指令,它指示编译器在实际编译开始之前对信息进行预处理。

所有预处理器指令都以 # 开头,并且一行中的预处理器指令前只能出现空白字符。预处理器指令不是 C++ 语句,因此它们不以分号 (;) 结尾。

您已经看过 #include 所有示例中的指令。该宏用于将头文件包含到源文件中。

C++ 支持许多预处理器指令,如#include、#define、#if、#else、#line 等。让我们看看重要的指令 -

#define 预处理器

#define 预处理器指令创建符号常量。符号常量称为 指令的一般形式是 -

#define macro-name replacement-text 

当此行出现在文件中时,该文件中所有后续出现的宏将在程序编译之前被替换文本替换。例如 -

#include <iostream>
using namespace std;

#define PI 3.14159

int main () {
   cout << "Value of PI :" << PI << endl; 

   return 0;
}

现在,假设我们有源代码文件,让我们对此代码进行预处理以查看结果。所以让我们用 -E 选项编译它并将结果重定向到 test.p。现在,如果你检查 test.p,它会有很多信息,在底部,你会发现替换的值如下 -

$gcc -E test.cpp > test.p

...
int main () {
   cout << "Value of PI :" << 3.14159 << endl; 
   return 0;
}

类函数宏

您可以使用#define 定义一个宏,该宏将采用如下参数 -

现场演示
#include <iostream>
using namespace std;

#define MIN(a,b) (((a)<(b)) ? a : b)

int main () {
   int i, j;
   
   i = 100;
   j = 30;
   
   cout <<"The minimum is " << MIN(i, j) << endl;

   return 0;
}

如果我们编译并运行上面的代码,这将产生以下结果 -

The minimum is 30

条件编译

有几个指令可用于编译程序源代码的选择性部分。这个过程称为条件编译。

条件预处理器结构很像“if”选择结构。考虑以下预处理器代码 -

#ifndef NULL
   #define NULL 0
#endif

您可以编译程序以进行调试。您还可以使用单个宏打开或关闭调试,如下所示 -

#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

这会导致 cerr 如果符号常量 DEBUG 已在指令 #ifdef DEBUG 之前定义,则要在程序中编译的语句。您可以使用#if 0 语句来注释掉程序的一部分,如下所示 -

#if 0
   code prevented from compiling
#endif

让我们试试下面的例子 -

现场演示
#include <iostream>
using namespace std;
#define DEBUG

#define MIN(a,b) (((a)<(b)) ? a : b)

int main () {
   int i, j;
   
   i = 100;
   j = 30;

#ifdef DEBUG
   cerr <<"Trace: Inside main function" << endl;
#endif

#if 0
   /* This is commented part */
   cout << MKSTR(HELLO C++) << endl;
#endif

   cout <<"The minimum is " << MIN(i, j) << endl;

#ifdef DEBUG
   cerr <<"Trace: Coming out of main function" << endl;
#endif

   return 0;
}

如果我们编译并运行上面的代码,这将产生以下结果 -

The minimum is 30
Trace: Inside main function
Trace: Coming out of main function

# 和 ## 运算符

# 和 ## 预处理器运算符在 C++ 和 ANSI/ISO C 中可用。# 运算符将替换文本标记转换为用引号括起来的字符串。

考虑以下宏定义 -

现场演示
#include <iostream>
using namespace std;

#define MKSTR( x ) #x

int main () {

   cout << MKSTR(HELLO C++) << endl;

   return 0;
}

如果我们编译并运行上面的代码,这将产生以下结果 -

HELLO C++

让我们看看它是如何工作的。很容易理解,C++ 预处理器转行 -

cout << MKSTR(HELLO C++) << endl;

上面的行将变成下面的行 -

cout << "HELLO C++" << endl;

## 运算符用于连接两个标记。这是一个例子 -

#define CONCAT( x, y )  x ## y

当 CONCAT 出现在程序中时,它的参数被连接起来并用于替换宏。比如程序中的CONCAT(HELLO, C++)替换为“HELLO C++”如下。

现场演示
#include <iostream>
using namespace std;

#define concat(a, b) a ## b
int main() {
   int xy = 100;
   
   cout << concat(x, y);
   return 0;
}

如果我们编译并运行上面的代码,这将产生以下结果 -

100

让我们看看它是如何工作的。很容易理解 C++ 预处理器转换 -

cout << concat(x, y);

上面的行将转换为下面的行 -

cout << xy;

预定义的 C++ 宏

C++ 提供了一些下面提到的预定义宏 -

Sr.No 宏和说明
1

__LINE__

这包含程序正在编译时的当前行号。

2

__FILE__

这包含程序正在编译时的当前文件名。

3

__DATE__

这包含一个格式为月/日/年的字符串,它是源文件转换为目标代码的日期。

4

__TIME__

这包含一个小时:分钟:秒形式的字符串,它是程序编译的时间。

让我们看一个上面所有宏的例子 -

现场演示
#include <iostream>
using namespace std;

int main () {
   cout << "Value of __LINE__ : " << __LINE__ << endl;
   cout << "Value of __FILE__ : " << __FILE__ << endl;
   cout << "Value of __DATE__ : " << __DATE__ << endl;
   cout << "Value of __TIME__ : " << __TIME__ << endl;

   return 0;
}

如果我们编译并运行上面的代码,这将产生以下结果 -

Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48

C语言

  1. C# 预处理器指令
  2. C++ 数据类型
  3. C++ 运算符
  4. C++ 注释
  5. C++ 构造函数
  6. C++ 类模板
  7. C - 预处理器
  8. C++ 概述
  9. C++ 常量/文字
  10. C++ 中的运算符
  11. C++ 中的数字
  12. C++ 参考资料