C语言中的宏和预处理器


C 预处理器不是编译器的一部分,而是编译过程中的一个单独步骤。简单来说,C 预处理器只是一个文本替换工具,它指示编译器在实际编译之前进行必要的预处理。我们将 C 预处理器称为 CPP。

所有预处理器命令都以井号 (#) 开头。它必须是第一个非空白字符,为了可读性,预处理器指令应从第一列开始。以下部分列出了所有重要的预处理器指令 -

序号指令 & 描述
1#define
替换预处理器宏。
2#include
从另一个文件插入特定的头文件。
3#undef
取消定义预处理器宏。
4#ifdef
如果此宏已定义,则返回真。
5#ifndef
如果此宏未定义,则返回真。
6#if
测试编译时条件是否为真。
7#else
#if 的替代方案。
8#elif
#else 和 #if 合并成一条语句。
9#endif
结束预处理器条件。
10#error
在 stderr 上打印错误消息。
11#pragma
使用标准化方法向编译器发出特殊命令。

一些预处理器的例子 -

分析以下示例以了解各种指令。

#define MAX_ARRAY_LENGTH 20

此指令告诉 CPP 将 MAX_ARRAY_LENGTH 的实例替换为 20。使用 #define 定义常量以提高可读性。

#include <stdio.h>
#include "myheader.h"

这些指令告诉 CPP 从**系统库**获取 stdio.h 并将文本添加到当前源文件中。下一行告诉 CPP 从本地目录获取**myheader.h**并将内容添加到当前源文件中。

#undef FILE_SIZE
#define FILE_SIZE 42

它告诉 CPP 取消定义现有的 FILE_SIZE 并将其定义为 42。

#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif

它告诉 CPP 仅在 MESSAGE 未定义时定义 MESSAGE。

#ifdef DEBUG
/* Your debugging statements here */
#endif

它告诉 CPP 在定义 DEBUG 时处理包含的语句。如果您在编译时向 gcc 编译器传递 -DDEBUG 标志,这将很有用。这将定义 DEBUG,因此您可以在编译过程中动态地打开和关闭调试。

预定义宏 -

ANSI C 定义了许多宏。尽管每个宏都可用于编程,但预定义宏不应直接修改。

序号宏 & 描述
1__DATE__
当前日期,以“MMM DD YYYY”格式的字符文字表示。
2__TIME__
当前时间,以“HH:MM:SS”格式的字符文字表示。
3__FILE__
包含当前文件名,以字符串文字表示。
4__LINE__
包含当前行号,以十进制常量表示。
5__STDC__
当编译器符合 ANSI 标准时定义为 1。

示例

#include <stdio.h>
int main() {
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );
}

输出

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

更新于: 2019-07-30

3K+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告