原文: https://www.programiz.com/c-programming/c-preprocessor-macros

在本教程中,将向您介绍 c 预处理器,并在示例的帮助下学习使用#include#define和条件编译。

C 预处理器和宏 - 图1

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

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

  1. #define PI 3.14

C 预处理器的一些常见用法是:


包括头文件:#include

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

  1. #include <stdio.h>

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

这就是为什么在使用scanf()printf()之类的函数之前需要使用#include <stdio.h>的原因。

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

  1. #include "my_header.h"

访问此页面以了解有关头文件的更多信息


使用#define的宏

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

这是一个例子。

  1. #define c 299792458 // speed of light

在这里,当我们在程序中使用c时,将其替换为299792458


示例 1:#define预处理器

  1. #include <stdio.h>
  2. #define PI 3.1415
  3. int main()
  4. {
  5. float radius, area;
  6. printf("Enter the radius: ");
  7. scanf("%f", &radius);
  8. // Notice, the use of PI
  9. area = PI*radius*radius;
  10. printf("Area=%.2f",area);
  11. return 0;
  12. }

像宏一样的函数

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

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

每次程序遇到circleArea(argument)时,都将其替换为(3.1415*(argument)*(argument))

假设我们传递了 5 作为参数,则它扩展如下:

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

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

  1. #include <stdio.h>
  2. #define PI 3.1415
  3. #define circleArea(r) (PI*r*r)
  4. int main() {
  5. float radius, area;
  6. printf("Enter the radius: ");
  7. scanf("%f", &radius);
  8. area = circleArea(radius);
  9. printf("Area = %.2f", area);
  10. return 0;
  11. }

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


条件编译

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

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

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


条件的用法

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

如何使用条件?

要使用条件指令,请使用#ifdef#if#defined#else#elseif指令。


#ifdef指令

  1. #ifdef MACRO
  2. // conditional codes
  3. #endif

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


#if#elif#else指令

  1. #if expression
  2. // conditional codes
  3. #endif

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

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

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

  1. #if expression
  2. conditional codes if expression is non-zero
  3. #else
  4. conditional if expression is 0
  5. #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

推荐阅读