前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >头文件防卫式声明

头文件防卫式声明

作者头像
C语言与CPP编程
发布2020-12-24 14:51:21
5780
发布2020-12-24 14:51:21
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程

C语言一般提供三种预处理功能:宏处理、文件包含、条件编译。头文件防卫式申明中会用到条件编译中 #ifndef#define#endif 的用法。所以,首先价绍下条件编译。

1 条件编译

一般情况下,在生成可执行文件的过程中,源程序文件中的所有代码行都进行编译,但是在一些跨操作系统的情况下,要求代码既能在 Windows 下编译运行,也能在 Linux 下编译运行,因为在不同的操作系统下调用的某些函数只能在特定的操作系统编译运行,此时就需要使用条件编译,让部分代码在满足特定条件下编译。

条件编译的几种格式

格式 1

代码语言:javascript
复制
#ifdef 标识符
   程序段代码1
#else
   程序段代码2
#endif

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

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

代码语言:javascript
复制
#define DEBUG
//然后在代码中需要输出调试信息的地方,写一些输出信息,例如:
#ifdef DEBUG
   printf("调试需要输出的提示信息\n");
#endif

格式 2

代码语言:javascript
复制
#ifndef 标识符
    程序段代码 1 
#else 
    程序段代码 2
#endif

作用:若标识符未被定义,则编译程序段代码 1,否则编译程序段代码 2。与格式 1 正好相反,RELEASE 模式与 DEBUG 模式正好相对,所以格式 1 调试的例子也可以写成这样:

代码语言:javascript
复制
#define RELEASE
//然后在代码中需要输出调试信息的地方,写一些输出信息,例如:
#ifndef RELEASE
   printf("调试需要输出的提示信息\n");
#endif

格式 3

代码语言:javascript
复制
#if 表达式
    程序段代码 1
#else if 表达式2
    程序段代码 2
#else 
    程序段代码 3
#endif   

跨平台项目开发,采用条件编译可以同同一套代码在不修改代码的情况下在 Windows 平台与 Linux 平台编译通过生成可执行文件,增加代码的可移植性。例如;

代码语言:javascript
复制
if __Linux__
   //Linux专有函数代码
#elif _Win32
   //windows专有函数代码
#else
   //其他平台专有函数代码
#endif

2 头文件防卫式声明

在多文件包含的情况下,有些变量何你可能被直接的或者间接的重复定义,重复 #include 的问题也可能发生,可以通过 #ifndef#define#endif 防卫式声明解决这一问题。

范例:

  • 头文件 head1.h 有如下定义:
代码语言:javascript
复制
int g_head1 = 1;
  • 头文件 head2.h 有如下定义:
代码语言:javascript
复制
int g_head2 = 2;
  • 源文件 .cpp 中使用 g_head1g_head2代码如下:
代码语言:javascript
复制
#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
复制
#include "head1.h";
int g_head2 = 2;

此时编译就会出现重复定义的错误,这是因为源文件.cpp 包含了头文件 head1.hhead2.h"head2.h 中也包含 head1.h头文件,所以head1.h 定义的 g_head1 被定义两次。

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

修改后再次编译,通过并成功执行,使用#ifndef#define#endif 组合的防卫式声明,避免了头文件内容被多次 include,所以在写 .h 文件时,要习惯性的使用文件防卫式声明。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言与CPP编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 条件编译
    • 格式 1
      • 格式 2
        • 格式 3
        • 2 头文件防卫式声明
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档