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