C预处理程序不是编译器的一部分,而是编译过程中的单独步骤。简单来说,C预处理器只是一个文本替换工具,它指示编译器在实际编译之前进行所需的预处理。我们将C预处理器称为CPP。
所有预处理器命令均以井号(#)开头。它必须是第一个非空白字符,并且为了可读性,预处理器指令应在第一列中开始。以下部分列出了所有重要的预处理器指令-
序号 | 指令与说明 |
---|---|
1 | #define 替代预处理器宏。 |
2 | #include 从另一个文件插入特定的标头。 |
3 | #undef取消 定义预处理程序宏。 |
4 | #ifdef 如果定义了此宏,则返回true。 |
5 | #ifndef 如果未定义此宏,则返回true。 |
6 | #if 测试编译时间条件是否为true。 |
7 | #else #if的替代方法。 |
8 | #elif #else和#if在一条语句中。 |
9 | #endif 结束预处理程序的条件。 |
10 | #error 在stderr上显示错误消息。 |
11 | #pragma 使用标准化方法向编译器发出特殊命令。 |
预处理器的一些例子-
分析以下示例以了解各种指令。
#define MAX_ARRAY_LENGTH 20
该指令告诉CPP用20替换MAX_ARRAY_LENGTH的实例。对常量使用#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 "你希望!" #endif
它告诉CPP仅在尚未定义MESSAGE时定义MESSAGE。
#ifdef DEBUG /* Your debugging statements here */ #endif
如果定义了DEBUG,它将告诉CPP处理包含的语句。如果在编译时将-DDEBUG标志传递给gcc编译器,这将很有用。这将定义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