1. 主页
  2. 文档
  3. C语言教程
  4. C语言预处理器
  5. C/C++ 预处理器指令

C/C++ 预处理器指令

预处理器指令:在我们遇到的几乎每个 C/C++ 程序中,我们都会在程序顶部看到几行,前面有一个井号 (#)。这些行在实际编译开始之前由编译器进行预处理。这些行的结尾由换行符 ‘\n’ 标识,没有分号 ‘;’ 需要终止这些行。
预处理器指令主要用于定义宏、评估条件语句、源文件包含、pragma 指令、行控制、错误检测等。

在这篇文章中,我们将讨论下面给出的更多类型的预处理器指令:

  1. 条件编译
  2. Line control
  3. 错误指令

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

条件编译:条件编译指令有助于编译程序的特定部分,或者让我们根据某些条件跳过程序的某些特定部分的编译。在我们之前的文章中,我们讨论了两个这样的指令“ ifdef ”和“ endif ”。在这篇文章中,我们将讨论#ifndef#if#else#elif

  • #ifdef:该指令是最简单的条件指令。该块称为条件组。如果定义了宏名,则受控文本将包含在预处理器输出中。条件中的受控文本将包含预处理指令。它们仅在条件成功时执行。您可以将它们嵌套在多个层中,但它们必须完全嵌套。换句话说,“#endif”总是匹配最近的“#ifdef”(或“#ifndef”或“#if”)。此外,您不能在一个文件中开始条件组并在另一个文件中完成它。

语法:

#ifdef MACRO
controlled text
#endif /* macroname */
  • #ifndef:我们知道 #ifdef 指令中如果定义了宏名,那么 #ifdef 指令后面的语句块将正常执行,但如果未定义,编译器将直接跳过该语句块。#ifndef 指令与#ifdef 指令完全相反。在 #ifndef 的情况下,仅当未定义带有 #ifndef 的宏或标识符时,才会执行 #ifndef 和 #endif 之间的语句块。
    语法 :
ifndef macro_name
statement1;
statement2;
statement3;
.
.
.
statementN;
endif

如果名称为“macroname”的宏未使用#define 指令定义,则仅执行语句块。

  • #if、#else 和 #elif:这些指令一起工作,并使用某些条件控制程序部分的编译。如果带有 #if 指令的条件的计算结果为非零值,则紧接在 #if 指令之后的行组将被执行,否则如果带有 #elif 指令的条件的计算结果为非零值,则该行组#elif 指令之后将立即执行,否则 #else 指令之后的行将被执行。
    语法:
#if macro_condition
statements
#elif macro_condition
statements
#else
statements
#endif

例子:

#include<iostream>

#define gfg 7

#if gfg > 200
#undef gfg
#define gfg 200
#elif gfg < 50
#undef gfg
#define gfg 50
#else
#undef gfg
#define gfg 100
#endif

int main()
{
std::cout << gfg; // gfg = 50
} 

输出:

50

注意#if、#elif 和#else 链式指令的整个结构如何以#endif 结尾。

  • #line:每当我们编译一个程序时,程序中都有可能出现一些错误。每当编译器在程序中发现错误时,它都会向我们提供发现错误的文件名以及行列表以及错误所在的确切行号。这使我们很容易发现和纠正错误。
    但是,我们可以使用#line 指令控制编译器在编译错误期间应提供哪些信息。
    语法:
#line number "filename"

number – 将分配给下一个代码行的行号。从此时起,连续行的行号将一一增加。
“filename” ——可选参数,允许重新定义将显示的文件名。

  • 错误指令(#error):该指令在编译过程中在程序中发现它时会中止编译过程,并产生一个可选的错误,可以指定为参数。
    语法:
#error optional_error

在这里,optional_error是用户指定的任何错误,当在程序中找到该指令时将显示该错误。
例子:

#ifndef cxydh
#error cxydhnot found !
#endif 

输出:

error: #error cxydh not found !

 

这篇文章对您有用吗?