C预处理器知识点总结

it2026-04-13  3

前言

提示:主要记录学习编程的经验和个人知识点总结,好记性不如烂笔头。


提示:以下是本篇文章正文内容,主要讲 C预处理器

一、C预处理器是什么

在编译和链接之前,还需要对源文件进行一些文本方面的操作,比如文本替换、文件包含、删除部分代码等,这个过程叫做预处理,由预处理程序完成。 C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。 注意:预处理器指令在编译之前执行。

二、详细用法

1.指令集合

如下:

指令描述#define定义宏#include包含一个源代码文件#undef取消已定义的宏#ifdef如果宏已定义,则返回结果为真#ifndef如果宏没有定义,则返回结果为真 提示:注意中间的n代表not#if如果条件为真,编译以下代码#else#if的替代方案,类似if …else语句#elif如果#if条件不为真,当前条件为真,则编译下面的代码 提示:理解为else if#endif结束一个#if…#else 条件编译块#else#if的替代方案 提示:类似if else语句#error当遇到标准错误时,输出错误消息#pragma使用标准化方法,向编译器发布特殊的命令到编译器中

2. 用法

1. #define

无参宏定义 无参宏定义的宏名不带参数。 定义一般形式为: #define 标识符 字符串

“#”表示这是预处理器命令。凡是以#开头的均为预处理命令。define为宏定义定义的宏名。字符串可以是常数、表达式、格式串等。

例如:

#define MAXNUM 99999

这样MAXNUM就被简单定义为99999。

有参宏定义

C++允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:

#define 宏名(形参表) 字符串

在字符串中含有各个形参。在使用时调用带参宏调用的一般形式为:宏名(实参表);

例如:

#define add(x,y) (x+y) int main() { cout << "1 plus 1 is"<< add(1,1.5)<<".\n"; //输出“1 plus 1 is 2.5.” system("pause"); return 0; }

函数定义为(a+b),加括号的原因是,宏定义只是在预处理阶段做了简单的替换,如果单纯的替换为a+b,使用5add(2,3)时,被替换为52+3,而非5*(2+3),值为25.

宏定义中的特殊操作符

define中的特殊操作符有#,##和…and_VA_ARGS_

2. #ifndef

#ifndef是if not defined 的简写,是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试。 这是预处理功能中三种(宏定义,文件包含,条件编译)中的第三种–条件编译。

备注:#ifndef和#endif要一起使用,如果丢失#endif,可能会报错。

#ifndef x//先测试x是否被宏定义过 #define x 程序段1//如果x没有被宏定义过,定义x,并编译程序段1 #else 程序段2//如果x已经定义过了,则编译程序段2的语句,忽视程序段1 #endif //终止if

作用:条件指示符#ifndef的主要目的是防止头文件的重复包含和编译。

#ifndef效果为防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件,头文件存在的价值就是被不同的源文件包含。

条件编译当然也可以用条件语句来实现,但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或者程序段2,生成的目标程序较短。

#ifndef 标识1 #define 标识1 #endif 语句4; 语句5

代码意思:如果标识1没有被定义,则重新定义标识1,即执行语句2,语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4,语句5。

如果有一个C源文件,包含了多个头文件,比如头文件A和头文件B,而头文件B包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。如果头文件A定义了结构体或者类类型,编译时会报大量的重复定义错误。

如要编写头文件test.h,在头文件开头写上两行:

#ifndef _TEST_H #define _TEST_H //一般采用文件名的大写 头文件结尾写上一句: #endif 这样一个工程文件里同时包含两个两个test.h时,就不会出现重定义的错误了。

标识的命名规则一般是头文件名全大写,前面加下划线,并把文件中的“.”也变成下划线,如stdio.h

#ifndef _STDIO_H #define _STDIO_H ... #endif

如果 .h 文件中定义了全局变量,一个C文件包含了同一个 .h 文件多次,如果不加 #ifndef 宏定义,会出现变量重复定义的错误,如果加了 #ifndef ,则不会出现这种错误。

3.参考文档

易百教程 W3Cschool RUNOOB C语言中文网 c/c++中define用法详解及代码示例 #ifndef

总结

能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。

条件编译允许只编译源程序中满足条件的程序段,多余的代码以及所有的宏都不会参与编译,使生成的目标程序较短,不仅保证了代码的正确性,还减小了编译后文件的体积,从而减少了内存的开销并提高了程序的效率。

使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。

最新回复(0)