C语言预处理器指南

需积分: 0 0 下载量 197 浏览量 更新于2024-06-19 收藏 461KB PDF 举报
“The C Preprocessor”是关于C语言预处理器的指南,适用于GCC版本13.1.0(GCC)。该文档由Richard M. Stallman和Zachary Weinberg编写,主要讨论了C语言预处理的各个方面,包括字符集、初步处理、标记化、预处理语言、头文件的使用等。 在C语言中,预处理器是编译过程的第一步,它负责处理源代码中的宏定义、条件编译指令和其他特殊指令。以下是预处理器涉及的关键知识点: 1. **字符集**:C语言支持ASCII字符集,包括字母、数字、标点符号和控制字符。预处理器会处理这些字符,如宏替换和条件编译时,会考虑字符编码。 2. **初步处理**:这个阶段,预处理器会进行以下操作: - 处理`#define`定义的宏,将宏名替换为它们的定义。 - 扩展`#include`指令,将头文件的内容插入到源文件中。 - 处理`#if`、`#ifdef`、`#ifndef`、`#else`、`#elif`和`#endif`等条件编译指令,根据条件决定是否包含或跳过某些代码块。 - 处理`#undef`,取消宏定义。 3. **标记化**:预处理器将源代码分解成一个个称为“标记”的单元,如标识符、关键字、常量、运算符和分隔符。这些标记是编译器进一步处理的基础。 4. **预处理语言**:预处理器有自己的简单语言,包括宏定义、条件编译指令等。宏可以有参数,允许动态生成代码,而条件编译则用于根据特定条件包含或排除代码。 5. **头文件**:头文件通常包含函数声明、常量定义和宏定义,用于共享代码和数据结构。预处理器通过`#include`指令来引入头文件。 - **Include语法**:`#include <file>`用于系统头文件,`#include "file"`用于用户头文件。 - **Include操作**:预处理器查找并插入指定的头文件。 - **搜索路径**:编译器会按照特定的路径顺序查找头文件,这些路径可以通过编译选项 `-I` 来添加或修改。 - **一次-only头文件**:`#pragma once`或`#ifndef`/`#define`/`#endif`组合用于确保头文件只被包含一次,防止重复定义问题。 - **替代wrapper#ifndef**:除了传统的`#ifndef`方法,还可以使用其他技术如`__has_include`来避免头文件重复包含。 - **计算式#include**:通过宏和条件编译,可以实现基于某些条件的动态头文件包含。 - **包装头文件**:有时为了控制头文件的包含,会使用包装头文件,它们通常包含`#ifndef`/`#define`/`#endif`结构,确保头文件仅被包含一次。 预处理器是C语言开发中不可或缺的一部分,理解和掌握这些概念对于编写高效、可维护的代码至关重要。通过熟练使用预处理器,开发者可以实现代码重用、条件编译和简化复杂逻辑,同时,理解预处理过程也有助于调试和优化程序。

checking whether the compiler supports GNU C++... yes checking whether g++ accepts -g... yes checking for g++ option to enable C++11 features... none needed checking dependency style of g++... gcc3 checking how to run the C preprocessor... gcc -std=gnu11 -E checking for x86_64-w64-mingw32-ranlib... no checking for ranlib... ranlib checking for x86_64-w64-mingw32-dlltool... no checking for dlltool... no checking for x86_64-w64-mingw32-ar... no checking for x86_64-w64-mingw32-lib... no checking for x86_64-w64-mingw32-link... no checking for ar... ar checking the archiver (ar) interface... ar checking dependency style of gcc -std=gnu11... gcc3 checking for x86_64-w64-mingw32-as... no checking for as... as checking whether dlltool supports --temp-prefix... yes checking whether to build a w32api package for Cygwin... no checking whether to build the Win32 libraries... yes checking whether to build the Win64 libraries... yes checking whether to build the WinARM32 libraries... no checking whether to build the WinARM64 libraries... no checking whether to use genlib... no checking whether to enable globbing... no checking whether to enable private exports... no checking whether to enable delay import libs... no checking what to provide as libmsvcrt.a... msvcrt-os checking whether to include support for Control Flow Guard... no checking whether to enable experimental features... no checking whether the compiler supports -municode... no checking for stdio.h... yes checking for stdlib.h... yes checking for string.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for strings.h... yes checking for sys/stat.h... yes checking for sys/types.h... yes checking for unistd.h... yes checking for _mingw_mac.h... no

2023-06-10 上传