📜  C / C++预处理程序指令|套装2

📅  最后修改于: 2021-05-30 10:38:13             🧑  作者: Mango

C / C++预处理程序指令基础知识

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

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

  1. 条件编译
  2. 线控
  3. 错误指令

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

  • 条件编译:条件编译指令有助于编译程序的特定部分,或者让我们根据某些条件跳过对程序某些特定部分的编译。在上一篇文章中,我们讨论了两个这样的指令’ ifdef ‘和’ endif ‘。在这篇文章中,我们将讨论#ifndef#if#else#elif
    1. #ifdef :此指令是最简单的条件指令。此块称为条件组。如果定义了宏名,则受控文本将包含在预处理器输出中。条件内的受控文本将包含预处理指令。仅在条件成功时才执行它们。您可以将它们嵌套在多个层中,但是它们必须完全嵌套。换句话说,“#endif”始终匹配最接近的“ #ifdef”(或“ #ifndef”或“ #if”)。同样,您不能在一个文件中开始条件组,而在另一个文件中完成它。

      句法:

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

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

    3. #if,#else和#elif :这些指令可以一起使用,并使用某些条件控制程序部分的编译。如果带有#if指令的条件的结果为非零值,那么将立即执行#if指令后的行组,否则,如果带有#elif指令的条件的结果为非零值,则该行组#elif指令之后将立即执行,否则#else指令之后的行将被执行。
      句法:
      #if macro_condition
         statements
      #elif macro_condition
         statements
      #else
         statements
      #endif
      

      例子:

      #include
        
      #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 –将分配给下一个代码行的行号。从此以后,连续行的行号将一一增加。
    “文件名” –可选参数,允许重新定义将显示的文件名。

  • 错误指令(#error) :在编译过程中在程序中找到该指令时,该指令将中止编译过程,并产生一个可选的错误,可以将其指定为参数。
    句法:
    #error optional_error
    

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

    #ifndef GeeksforGeeks
    #error GeeksforGeeks not found !
    #endif  
    

    输出:

    error: #error GeeksforGeeks not found !
    

参考:

  • ppd_better_practice_cs.auckland.ac.nz
  • http://www.cplusplus.com/doc/tutorial/preprocessor/
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。