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

Posted 刘润森!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学习C++ 教程十四C++ 中预处理器相关的知识,希望对你有一定的参考价值。

@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;
}

在上面的程序中,当编译器执行单词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;
}

在上面的程序,每当编译器在程序中找到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

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

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

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

其他指令

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

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

#undef LIMIT

使用此语句将取消定义现有的宏 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()

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

Inside main()

因为 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;
}

以上是关于小白学习C++ 教程十四C++ 中预处理器的主要内容,如果未能解决你的问题,请参考以下文章

小白学习C++ 教程十八C++ 中文件处理

小白学习C++ 教程二C++基础语法注释和变量

小白学习C++ 教程二十一C++ 中的STL容器Arrays和vector

小白学习C++ 教程二十一C++ 中的STL容器Arrays和vector

小白学习C++ 教程十五C++ 中的template模板和泛型

小白学习C++ 教程十C++中指针和内存分配