讲师中心 微信公众号
AI工具推荐 视频效率加速

C语言头文件防卫式声明

小磊吖_4993

小磊吖_4993

发布时间:2025-09-12 08:00:13

|

750人浏览过

|

来源于php中文网

原创

c语言一般提供三种预处理功能:宏处理、文件包含、条件编译。头文件防卫式申明中会用到条件编译中

#ifndef
、
#define
、
#endif
的用法。所以,首先价绍下条件编译。

1 条件编译

一般情况下,在生成可执行文件的过程中,源程序文件中的所有代码行都进行编译,但是在一些跨操作系统的情况下,要求代码既能在

Windows
下编译运行,也能在
Linux
下编译运行,因为在不同的操作系统下调用的某些函数只能在特定的操作系统编译运行,此时就需要使用条件编译,让部分代码在满足特定条件下编译。

条件编译的几种格式

格式 1代码语言:javascript代码运行次数:0运行复制
#ifdef 标识符   程序段代码1#else   程序段代码2#endif

作用:当标识符被定义过,则对程序段代码 1 进行编译,否则对程序段 2 进行编译。

平时,在进行程序调试过程中,需要输出一些信息方便调试,在调试结束后,不需要这些信息输出,我们可以这样处理:

立即学习“C语言免费学习笔记(深入)”;

代码语言:javascript代码运行次数:0运行复制
#define DEBUG//然后在代码中需要输出调试信息的地方,写一些输出信息,例如:#ifdef DEBUG   printf("调试需要输出的提示信息\n");#endif
格式 2代码语言:javascript代码运行次数:0运行复制
#ifndef 标识符    程序段代码 1 #else     程序段代码 2#endif

作用:若标识符未被定义,则编译程序段代码 1,否则编译程序段代码 2。与格式 1 正好相反,

RELEASE
模式与
DEBUG
模式正好相对,所以格式 1 调试的例子也可以写成这样:

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载
代码语言:javascript代码运行次数:0运行复制
#define RELEASE//然后在代码中需要输出调试信息的地方,写一些输出信息,例如:#ifndef RELEASE   printf("调试需要输出的提示信息\n");#endif
格式 3代码语言:javascript代码运行次数:0运行复制
#if 表达式    程序段代码 1#else if 表达式2    程序段代码 2#else     程序段代码 3#endif   

跨平台项目开发,采用条件编译可以同同一套代码在不修改代码的情况下在

Windows
平台与
Linux
平台编译通过生成可执行文件,增加代码的可移植性。例如;

代码语言:javascript代码运行次数:0运行复制
if __Linux__   //Linux专有函数代码#elif _Win32   //windows专有函数代码#else   //其他平台专有函数代码#endif
2 头文件防卫式声明

在多文件包含的情况下,有些变量何你可能被直接的或者间接的重复定义,重复

#include
的问题也可能发生,可以通过
#ifndef
、
#define
、
#endif
防卫式声明解决这一问题。

范例:

头文件 head1.h 有如下定义:代码语言:javascript代码运行次数:0运行复制
int g_head1 = 1;
头文件 head2.h 有如下定义:代码语言:javascript代码运行次数:0运行复制
int g_head2 = 2;
源文件 .cpp 中使用
g_head1
、
g_head2
代码如下:代码语言:javascript代码运行次数:0运行复制
#include "head1.h"#include "head2.h"#include <iostream>using namespace std;int main(){   cout<<g_head1<<endl;    //1   cout<<g_head2<<endl;    //2   return 0;}
随着项目增大或者其他需求,可能出现头文件的包含,例如头文件
head2.h
中包含头文件
head1.h
,头文件
head2.h
如下:代码语言:javascript代码运行次数:0运行复制
#include "head1.h";int g_head2 = 2;
C语言头文件防卫式声明

此时编译就会出现重复定义的错误,这是因为源文件.cpp 包含了头文件

head1.h
、
head2.h"
,
head2.h
中也包含
head1.h
头文件,所以
head1.h
定义的
g_head1
被定义两次。

头文件
head1.h
防卫式声明改造代码语言:javascript代码运行次数:0运行复制
#ifndef _HEAD1_#define _HEAD1_int g_head1 = 1;#endif
头文件
head2.h
防卫式声明改造代码语言:javascript代码运行次数:0运行复制
#ifndef _HEAD2_#define _HEAD2_#include "head1.h"int g_head2 = 2;#endif
C语言头文件防卫式声明

修改后再次编译,通过并成功执行,使用

#ifndef
、
#define
、
#endif
组合的防卫式声明,避免了头文件内容被多次
include
,所以在写 .h 文件时,要习惯性的使用文件防卫式声明。

更多案例可以go公众号:C语言入门到精通

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

619

2023.10.11

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

14380

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1103

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

8130

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

3222

2025.08.07

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3219

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2798

2023.07.27

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Revel 官方 Deployment 文档
Revel 官方 Deployment 文档

共0课时 | 0人学习

Conan 包创建教程
Conan 包创建教程

共0课时 | 0人学习

Valgrind发行文档与NEWS
Valgrind发行文档与NEWS

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn