C/C++中不同的预处理器指令

164 阅读4分钟

在这篇文章中,我们解释了C/C++中不同的预处理器指令以及C++代码示例。预处理器指令是在编译时处理的,是大型代码库中的一种重要的编程技术。

目录:

  1. 预处理机指令简介
  2. 文件包容指令
  3. 宏替代指令
  4. 条件性编译指令

让我们开始学习预处理程序指令。

预处理器指令的介绍

C语言中的预处理器是一个程序,它分析或处理程序中要使用的源代码文件,然后再交给编译器。

下图表示预处理器的运行情况 预处理器-1

预处理器指令是C语言中带有特殊命令的代码,这些代码不是C语言,而是给预处理器的特殊和具体的指令。

预处理器的语法:

它以'#'开头,不以分号(;)结束

在C语言中,有不同类型的预处理器指令:

  • 文件包容指令
  • 宏替代指令
    • 简单巨集
    • 有参数的巨集
    • 嵌套宏
  • 条件性编译指令
    • if指令
    • elif指令
    • ifdef指令
    • ifndef directives
    • else指令
    • endif指令
  1. 文件包容指令 =========

"#include "是文件包容预处理器指令。
语法:

#include<filename>

它命令编译器将指定文件的内容包含在指令中所包含的头文件下。

  1. 巨集替换指令 =========

宏置换是一个用预定义的字符串或值替换标识符的过程。"#define "是C语言中的宏置换指令。

在C语言中,有三种类型的宏。

a) 简单宏

这种类型的宏在C语言程序中替代一个定义的符号的值,每当该符号出现时,宏将用分配给它的值替代该符号。这主要用于程序中定义常量,这些常量在程序中反复出现,但数值没有变化。

例子:

#define PI 3.14

b) 争论式巨集

这个宏被称为有参数的宏,因为它看起来像一个函数。它代表小的代码片段,每次遇到宏的名称时,它的参数都会被替换成程序的实际参数。

例子:

#HALFOF(x)x/2

c) 嵌套宏:

一个宏可以在另一个宏中使用,这被称为宏的嵌套。

例子:

#define CUBE(x)SQR(x)*(x)
  1. 条件性编译指令 ==========

在C语言中,这种类型的预处理器有条件地抑制了源代码的编译部分。

有六种类型的条件性编译指令

i) if指令

if指令允许有条件的编译,预处理器对#if指令提供的表达式进行评估,以确定后续代码是否应该被包含在编译过程中。

语法:

#if conditional_expression
/* Example using #if directive*/
#include <stdio.h>
#define WINDOWS 1

int main()
{
   printf("The Website is a great ");

   #if WINDOWS
   printf("Windows ");
   #endif

   printf("resource.\n");

   return 0;
}

二)elif指令

当与if,ifdef或,ifndef指令一起使用时,#elif指令提供了一个备用的部分动作,当前面的#if,#ifdef或#ifndef指令的条件评估为假时,它包括#elif语句后面的C源代码,而#elif条件评估为真。

语法:

#elif conditional_expression
    /* Example using #elif directive*/

#include <stdio.h>

#define YEARS_OLD 12

int main()
{
   #if YEARS_OLD <= 10
   printf("The Website is a great resource.\n");
   #elif YEARS_OLD > 10
   printf("Website is over %d years old.\n", YEARS_OLD);
   #endif

   return 0;
}

iii) ifdef指令

ifdef指令在编译过程中包括后续的C代码之前,确定所提供的宏是否存在。

语法:

#ifdef macro_definition 
    /* Example using #ifdef directive*/

#include <stdio.h>

#define YEARS_OLD 10

int main()
{
   #ifdef YEARS_OLD
   printf("The Website is over %d years old.\n", YEARS_OLD);
   #endif

   printf("The Website is a great resource.\n");

   return 0;
}

iv) ifndef指令

在将后续的C程序代码纳入编译过程之前,ifndef指令确定所提供的宏是否存在。

语法:

#ifndef macro_definition
/* Example using #ifndef directive*/

#include <stdio.h>

#define YEARS_OLD 12
#ifndef YEARS_OLD
#define YEARS_OLD 10
#endif

int main()
{
   printf("The Website is over %d years old.\n", YEARS_OLD);

   return 0;
}

v) else指令

当与if、ifndef或ifdef指令一起使用时,#else指令提供了另一种操作,当#if、#ifndef或#ifdef指令的条件评估为假时,预处理器将包括#else语句后面的C程序代码。

语法:

#else
/* Example using #else directive */

#include <stdio.h>
#define YEARS_OLD 12
int main()
{
   #if YEARS_OLD < 10
   printf("The Website is a great resource.\n");
   #else
   printf("The Website is over %d years old.\n", YEARS_OLD);
   #endif
   return 0;
}

vi) endif指令

endif指令用于关闭if、ifdef、ifndef、elif、else指令,如果遇到#endif指令时,就完成了对开头指令的预处理。

语法:

#endif
/* Example using #endif directive */

#include <stdio.h>

#define WINDOWS 1

int main()
{
   printf("The Website is a great ");

   #if WINDOWS
   printf("Windows ");
   #endif

   printf("resource.\n");

   return 0;
}

通过OpenGenus的这篇文章,你必须对C/C++的预处理指令有完整的了解。