C 预处理器和宏

Working of a preprocessor in C programming
C 预处理器的作用

C 预处理器是一个宏处理器(允许您定义宏),它在您的程序被编译之前对其进行转换。这些转换可以是头文件的包含、宏展开等。

所有预处理指令都以 # 符号开头。例如,

#define PI 3.14

C 预处理器的某些常见用途是


包含头文件:#include

#include 预处理器用于包含 C 程序中的头文件。例如,

#include <stdio.h>

在这里,stdio.h 是一个头文件。#include 预处理器指令将上述行替换为 stdio.h 头文件的内容。

这就是为什么您需要在可以使用 scanf()printf() 等函数之前使用 #include <stdio.h>

您还可以创建自己的包含函数声明的头文件,并使用此预处理器指令将其包含在您的程序中。

#include "my_header.h"

访问此页面了解更多关于 使用头文件的信息。


使用 #define 定义宏

宏是给定名称的代码片段。您可以使用 #define 预处理器指令在 C 中定义宏。

这是一个例子。

#define c 299792458  // speed of light

在这里,当我们在程序中使用 c 时,它会被替换为 299792458


示例 1:#define 预处理器

#include <stdio.h>
#define PI 3.1415

int main()
{
    float radius, area;
    printf("Enter the radius: ");
    scanf("%f", &radius);

    // Notice, the use of PI
    area = PI*radius*radius;

    printf("Area=%.2f",area);
    return 0;
}

类似函数的宏

您还可以定义宏,这些宏的作用类似于函数调用。这被称为类函数宏。例如,

#define circleArea(r) (3.1415*(r)*(r))

每次程序遇到 circleArea(argument) 时,它都会被替换为 (3.1415*(argument)*(argument))

假设我们传递 5 作为参数,那么它会像下面这样展开

circleArea(5) expands to (3.1415*5*5)

示例 2:使用 #define 预处理器

#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI*r*r)

int main() {
    float radius, area;

    printf("Enter the radius: ");
    scanf("%f", &radius);
    area = circleArea(radius);
    printf("Area = %.2f", area);

    return 0;
}

访问此页面了解更多关于 宏和 #define 预处理器的信息。


条件编译

在 C 语言编程中,您可以指示预处理器是否包含代码块。为此,可以使用条件指令。

这类似于 if 语句,但有一个主要区别。

if 语句在执行时进行测试,以检查是否应执行代码块,而条件指令用于在执行之前包含(或跳过)程序中的代码块。


条件指令的用途

  • 根据机器、操作系统使用不同的代码
  • 将相同的源文件编译到两个不同的程序中
  • 从程序中排除某些代码,但将其保留作为将来使用的参考

如何使用条件指令?

要使用条件指令,会使用 #ifdef#if#defined#else#elif 指令。


#ifdef 指令

#ifdef MACRO     
   // conditional codes
#endif

在这里,仅当定义了 MACRO 时,条件代码才包含在程序中。


#if、#elif 和 #else 指令

#if expression
   // conditional codes
#endif

在这里,expression 是一个整数类型的表达式(可以是整数、字符、算术表达式、宏等)。

仅当 expression 被评估为非零值时,条件代码才包含在程序中。

可选的 #else 指令可以与 #if 指令一起使用。

#if expression
   conditional codes if expression is non-zero
#else
   conditional if expression is 0
#endif

您还可以使用 #elif 将嵌套条件添加到您的 #if...#else

#if expression
    // conditional codes if expression is non-zero
#elif expression1
    // conditional codes if expression is non-zero
#elif expression2
    // conditional codes if expression is non-zero
#else
    // conditional if all expressions are 0
#endif

#defined

特殊运算符 #defined 用于测试某个宏是否已定义。它经常与 #if 指令一起使用。

#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048
  // codes

预定义宏

以下是 C 语言编程中的一些预定义宏。

__DATE__ 一个包含当前日期的字符串。
__FILE__ 一个包含文件名的字符串。
__LINE__ 一个表示当前行号的整数。
__STDC__ 如果遵循 ANSI 标准 C,则该值为非零整数。
__TIME__ 一个包含当前时间的字符串。

示例 3:使用 __TIME__ 获取当前时间

下面的程序使用 __TIME__ 宏输出当前时间。

#include <stdio.h>
int main()
{
   printf("Current time: %s",__TIME__);   
}

输出

Current time: 19:54:39

推荐阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战