【小白学习C++ 教程】十四、C++ 中预处理器

举报
毛利 发表于 2021/07/30 23:46:35 2021/07/30
【摘要】 @Author:Runsen 预处理器程序提供预处理器指令,它告诉编译器在编译之前对源代码进行预处理。 所有这些预处理器指令都以“#”符号开头。’#’ 符号表示任何以# 开头的语句都将进入预处理程序,预处理程序将执行该语句。 一些预处理器指令的实例为:#include, #define, #ifndef, 宏文件包含条件编译其他指令 例如,#include 将...

@Author:Runsen

预处理器程序提供预处理器指令,它告诉编译器在编译之前对源代码进行预处理。

所有这些预处理器指令都以“#”符号开头。’#’ 符号表示任何以# 开头的语句都将进入预处理程序,预处理程序将执行该语句。

一些预处理器指令的实例为:#include, #define, #ifndef

  • 文件包含
  • 条件编译
  • 其他指令

例如,#include 将在程序中包含额外的代码。我们可以将这些预处理器指令放在C++程序的任何地方。

现在让我们详细了解这些指令中的每一个。

宏:宏是程序中的一段代码。每当编译器遇到此名称时,编译器都会用实际的代码段替换该名称。’#define’ 指令用于定义宏。现在让我们在程序的帮助下理解宏定义:

#include <iostream>
 
// 宏
#define LIMIT 5
int main()
{ for (int i = 0; i < LIMIT; i++) { std::cout << i << "\n"; } return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在上面的程序中,当编译器执行单词LIMIT时,它用5 替换它。宏定义中的单词’LIMIT’ 称为宏模板,‘5’ 是宏扩展。

注意:宏定义末尾没有分号(’;’)。宏定义不需要分号结束。

带参数的宏:我们也可以将参数传递给宏。使用参数定义的宏与函数的工作方式类似。让我们通过一个程序来理解这一点:

#include <iostream>
 
// 带参数的宏
#define AREA(l, b) (l * b)
int main()
{ int l1 = 10, l2 = 5, area; area = AREA(l1, l2); std::cout << "Area of rectangle is: " << area;  //50 return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在上面的程序,每当编译器在程序中找到AREA(l, b) 时,它就会用语句 (l*b) 替换它。不仅如此,传递给宏模板 AREA(l, b)的值也将在语句 (l*b)中被替换。因此 AREA(10, 5) 将等于 10*5。

文件包含

文件包含:这种类型的预处理器指令告诉编译器在源代码程序中包含一个文件。

用户可以在程序中包含两种类型的文件: 头文件或标准文件。

这些文件包含预定义函数的定义,如 printf()、scanf() 等。必须包含这些文件才能使用这些函数。不同的函数在不同的头文件中声明。例如,标准 I/O 函数在C++ 中的 ‘iostream’ 文件中,而执行字符串操作的函数在 ‘string’ 文件中。

语法:#include<file_name>

其中file_name是要包含的文件的名称。'<''>'括号告诉编译器在当前目录中查找文件。

条件编译

条件编译:条件编译指令是一种指令,可帮助编译程序的特定部分或根据某些条件跳过程序某些特定部分的编译。这可以在两个预处理命令“ ifdef”和“ endif ”的帮助下完成。

#ifdef macroname 
 程序段1
#else
 程序段2
#endif

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

条件编译选项:#if #ifdef #ifndef #else #elsif #end

这些以#号开头的定义称作条件编译表达式,满足其条件的内容会被编译到预处理的源代码文件中,而不满足条件的内容不会被编译到预处理的源代码中。例如:

#define TEST 1
#if TEST == 1
	int a = 1;
#else
	int a = 2;
#endif

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其他指令

除了上述指令外,还有两个不常用的指令。

这些是:
#undef 指令:#undef 指令用于取消定义现有的宏。该指令的作用是:

#undef LIMIT

  
 
  • 1

使用此语句将取消定义现有的宏 LIMIT。在此语句之后,每个“#ifdef LIMIT”语句都将评估为 false。

#pragma Directive:该指令是一个特殊用途的指令,用于打开或关闭某些功能。这种类型的指令是特定于编译器的,即它们因编译器而异。

#pragma startup#pragma exit:这些指令帮助我们指定在程序启动之前(在控制传递给 main() 之前)和程序退出之前(就在控制从 main() 返回之前)

#include <iostream>
using namespace std; void func1();
void func2(); #pragma startup func1
#pragma exit func2 void func1()
{ cout << "Inside func1()\n";
} void func2()
{ cout << "Inside func2()\n";
} int main()
{ void func1(); void func2(); cout << "Inside main()\n"; return 0;
} Inside func1()
Inside main()
Inside func2()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

上面的程序不适用于 GCC 编译器,当在 GCC 编译器上运行时,上面的代码将产生如下输出:

Inside main()

  
 
  • 1

因为 GCC 不支持 #pragma启动或退出。

Code:创建函数来检查素数

#include <iostream>
using namespace std;

bool checkPrimeNumber(int);

int main() { int n; cout << "Enter a positive  integer: "; cin >> n; if (checkPrimeNumber(n)) cout << n << " is a prime number."; else cout << n << " is not a prime number."; return 0;
}

bool checkPrimeNumber(int n) { bool isPrime = true; // 0 and 1 are not prime numbers if (n == 0 || n == 1) { isPrime = false; } else { for (int i = 2; i <= n / 2; ++i) { if (n % i == 0) { isPrime = false; break; } } } return isPrime;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: maoli.blog.csdn.net,作者:刘润森!,版权归原作者所有,如需转载,请联系作者。

原文链接:maoli.blog.csdn.net/article/details/119223111

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。