首页 > 编程语言 >【c&c++】C语言中#ifdef,#ifndef和#endif的作用

【c&c++】C语言中#ifdef,#ifndef和#endif的作用

时间:2022-11-17 10:38:10浏览次数:44  
标签:文件 头文件 endif c++ C语言 ifdef include define

现在规定一下头文件书写规范,

根据陈皓编写的跟我一起些makefile,一定要记住:头文件中应该只是声明,而定义应该放在C/C++文件中。否则如果出现有定义,比如头文件中有int a =2;如果有多个源程序文件引用该头文件,那么在链接的时候就会出现重复定义,即使在头文件的首尾添加#ifnef,#define ,#enddif这样的形式也挽救不了这种错误,事实上,#ifnef和#enddif的作用仅仅是防止头文件嵌套包含。以下是转载https://blog.csdn.net/weixin_41656968/article/details/80493923

 

1、用于注释掉一段代码

我们自己编写程序的时候,需要看到一系列的调试代码,但是发给客户的时候,客户可不希望看到什么什么OK的代码,所以我们希望能很容易地注释掉这段代码。 
这时需要用到预处理指令 #ifdef 和 #endif :

#include <stdio.h>
#define CONFIG_DEBUG 
int main(){
    FILE *fp;
    fp=fopen("D:\\DEV\\test.txt","r"); 
    if(NULL==fp){
        printf("error!");
    }
#ifdef CONFIG_DEBUG 
    printf("open test.txt ok");
#endif
    return 0;
}

如果文件在那个路径没错的话,将会打印如下信息:

 

 

如果不想要看到这样的调试信息的话,注释掉#define CONFIG_DEBUG这句就行。

2、防止头文件重复包含

a.h

#include <stdio.h>

#include "b.h"

b.h

#include "a.h"

c.c

#include "a.h"

#include "b.h"

int main(){

printf("Hello!");

}

如果你程序是这样写的话,编译器就会出现Error #include nested too deeply的错误。 
因为这里 b.h 和 a.h 都互相包含,c.c文件在include的时候重复include了a.h,我们希望c.c文件中执行#include "b.h"的时候 b.h 能进行判断,如果没有#include "a.h"则include,如果已经include了,则不再重复定义。

可以将b.h修改为:

#ifndef _A_H

#define _A_H

#include "a.h"

#endif

标签:文件,头文件,endif,c++,C语言,ifdef,include,define
From: https://www.cnblogs.com/opensmarty/p/16898552.html

相关文章

  • C语言创建树
    C语言创建树所需要的文件创建树一般是采用层次遍历创建的方法1.先定义树中有什么,有值,有左右孩子指针,这个指针指向左右孩子,本质就是指向下一个节点2.创建数组,只不过指针......
  • 计算机等级考试二级C语言程序设计专项训练题——程序设计题(二)
    11、请编写函数fun,它的功能是计算下列级数和,和值由函数值返回。例如,当n=10,x=0.3时,函数值为1.349859。注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号......
  • 计算机等级考试二级C语言程序设计专项训练题——程序设计题(一)
    1、请写函数proc(),其功能是:求正整数x和y的最大公约。例如,程序执行时,若输入的两个正整数为12,24,则它们的最大公约数为12,最小公倍数为24。注意:部分源程序给出如下。请勿改动m......
  • ACV1引擎脚本处理(C++)
    推荐在Github进行阅读:ACV1引擎脚本处理(C++)ACV1引擎脚本处理(C++)0x00知识背景开始处理脚本之前希望大家熟悉或至少用过以下知识内容。1、C基础语法2、C++面向对象基......
  • c++定义二维数组
     vector<vector<int>>vec;        //定义行列未知的二维数组vector<vector<int>>array(5);     //定义行为5的二维数组vector<vector<......
  • C++:将char*指针强制转换成一个指向结构体的指针
    在使用Socket与雷达进行通信采集数据时,会遇到“打包与解包”的问题,在打包和解包过程中,会涉及到结构体指针与字符指针间的强制转换。如下:打包就是将包头与信息封装成一定大......
  • Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版
    以前写过同样话题下的图文版的,这里给出一个代码Demo版本,上一个图文版本参见:​​Linux环境下配置vscode的C/C++的make编译环境(编写makefile方式)​​  ===================......
  • tensorflow1.x——如何在C++多线程中调用同一个session会话tensorflow1.x
     =================================================  从前文​​tensorflow1.x——如何在python多线程中调用同一个session会话​​可以知道,使用python多线程调用同一......
  • windows--cmake与c++的使用教程(9)
    1概述本文基于前文环境本节目标:动态库和Exe项目修改CMake默认输出路径2准备工作目录结构.│CMakeLists.txt└─srcmain.cc2.1代码准备main......
  • C++Primer 第2章
    第2章变量和基本类型数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。2.1基本内置类型C++定义了一套包括算术类型(arithmetictype)和空类型(vo......