跳到主要内容

C 语言预处理器和宏

提示
  1. 宏定义与包含头文件:C预处理器使用#define定义宏,用于代码替换,以及#include指令包含头文件,例如#include <stdio.h>
  2. 函数式宏:可以定义类似函数调用的宏,如#define circleArea(r) (3.1415*(r)*(r)),在程序中用作表达式替换。
  3. 条件编译:使用#if#ifdef#else等指令进行条件编译,根据不同的条件包含或排除代码块。

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 // 光速

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

示例 1:#define 预处理

#include <stdio.h>
#define PI 3.1415

int main()
{
float radius, area;
printf("输入半径: ");
scanf("%f", &radius);

// 注意使用 PI
area = PI*radius*radius;

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

类似函数的宏

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

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

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

假设我们传递 5 作为参数,那么它将展开为:

circleArea(5) 展开为 (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("输入半径: ");
scanf("%f", &radius);
area = circleArea(radius);
printf("面积 = %.2f", area);

return 0;
}

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

条件编译

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

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

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

条件的用途

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

如何使用条件?

使用条件时,可以使用 #ifdef#if#defined#else#elif 指令。

#ifdef 指令

#ifdef MACRO
// 条件代码
#endif

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

#if、#elif 和 #else 指令

#if expression
// 条件代码
#endif

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

只有在表达式评估为非零值时,条件代码才会包含在程序中。

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

#if expression
如果表达式为非零,则条件代码
#else
如果表达式为 0,则条件代码
#endif

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

#if expression
// 如果表达式为非零,则条件代码
#elif expression1
// 如果表达式为非零,则条件代码
#elif expression2
// 如果表达式为非零,则条件代码
#else
// 如果所有表达式都为 0,则条件代码
#endif

#defined

特殊操作符 #defined 用于测试某个宏是否定义。它通常与 #if 指令一起使用。

#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048
// 代码

预定义宏

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

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

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

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

#include <stdio.h>
int main()
{
printf("当前时间: %s",__TIME__);
}

输出

当前时间: 19:54:39

推荐阅读