精华内容
下载资源
问答
  • 1 #ifndef方式 2 #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ … … // 一些声明...
  • 问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译 ======================================================== 用法: .h文件,如下: #ifndef XX_H #define XX_H … #endif 这样如果有两个地方都...
  • #ifdef_#else_#endif_#if_#ifndef的用法.txt
  • 主要介绍了C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别的相关资料,需要的朋友可以参考下
  • #ifndef 在头文件中的作用。
  • ifndef 的用法

    2015-09-03 21:42:23
    ifndef用法
  • 一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含...
  • ifndef详解

    千次阅读 2021-01-29 10:14:00
    ifndef详解 #ifndef 是"if not defined"的简写,是预处理功能(宏定义、文件包含、条件编译)当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是: 防止头文件的重复包含和编译; 便于程序...

    ifndef详解

    #ifndef 是"if not defined"的简写,是预处理功能(宏定义、文件包含、条件编译)当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是:

    1. 防止头文件的重复包含和编译;
    2. 便于程序的调试和移植;

    下面分别举例描述。

    一、防止头文件的重复包含和编译
    下面是错误示范:

    headfile_1.h

     1 #include <iostream>
     2 class CTest_1 {
     3     CTest_1() {
     4         //do something,eg:init;
     5     }
     6     ~CTest_1() {
     7         //do something ,eg:free;
     8     }
     9     void PrintScreen()
    10     {
    11         std::cout << "this is Class CTest_1!" << std::endl;
    12     }
    13 };
    

    headfile_2.h

     1 #include "headfile_1.h"
     2 class CTest_2 {
     3     CTest_2() {
     4         //do something,eg:init;
     5     }
     6     ~CTest_2() {
     7         //do something,eg:free;
     8     }
     9     void PrintScreen()
    10     {
    11         std::cout << "this is Class CTest_2!" << std::endl;
    12     }
    13 };
    

    sourcefile.cpp

    1 #include <iostream>
    2 #include "headfile_1.h"
    3 #include "headfile_2.h"
    4 
    5 int main()
    6 {
    7     return 0;
    8 }
    

    编译时提示重定义错误:
    在这里插入图片描述

    以上显示headfile_1.h中的类CTest_1重定义了。

    一般地,假如有一个C源文件(如sourcefile.cpp),它包含两个头文件(如headfile_1.h和headfile_2.h),而头文件headfile_2.h又包含了headfile_1.h,则最终的效果是该源文件包含了两次headfile_1.h。如果你在头文件里定义了结构体或者类类型,那么问题来了,编译时将会报重复定义的错误。

    加上条件编译"ifndef"则问题可解决。在headfile_1.h中加上条件编译,如下:

    headfile_1.h

     1 #ifndef _HEADFILE_1_H
     2 #define _HEADFILE_1_H
     3 #include <iostream>
     4 class CTest_1 {
     5     CTest_1() {
     6         //do something,eg:init;
     7     }
     8     ~CTest_1() {
     9         //do something ,eg:free;
    10     }
    11     void PrintScreen()
    12     {
    13         std::cout << "this is Class CTest_1!" << std::endl;
    14     }
    15 };
    16 
    17 #endif    //end of _HEADFILE_1_H
    

    编译通过!

    分析:当第一次包含headfile_1.h时,由于没有定义_HEADFILE_1_H,条件为真,这样就会执行#ifndef _HEADFILE_1_H和#endif之间的代码;当第二次包含headfile_1.h时,前面一次已经定义了_HEADFILE_1_H,条件为假,#ifndef _HEADFILE_1_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义。

    小结:还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你最好都加上这个。一般格式是这样的:

    #ifndef <标识>
    #define <标识>
    
    ......
    
    ......
    
    #endif
    

    <标识>在理论上来说是可以自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的明明规则一般是头文件名全大写,前面加下划线,并把文件名中的"."也变成下划线,如:stdio.h

    #ifndef _STDIO_H
    #define _STDIO_H
    
    ......
    
    ......
    
    #endif
    

    注意:#ifndef起到的效果是防止一个源文件多次包含同一个头文件,而不是防止两个源文件包含同一个头文件。事实上,防止同一头文件被两个不同的源文件包含这种要求本身就是不合理的,头文件存在的价值就是被不同的源文件包含。

    二、便于程序的调试和移植
      在调试程序时,常常需要对程序中的内容进行选择性地编译,即可以根据一定的条件选择是否编译。

    主要分以下几种:

    1、

    #ifndef 标识符
    
    程序段 1
    
    #else
    
    程序段 2
    
    #endif
    

    它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。

    2、

    #ifndef 标识符
    
    #define 标识符
    
    程序段 1
    
    #else
    
    程序段 2
    
    #endif
    

    它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。

    3、

    #if 表达式
    
    程序段 1
    
    #else
    
    程序段 2
    
    #endif
    

    它的作用是当“表达式”值为真时,编译“程序段1”,否则编译“程序段2”。

    注:以上三种形式中#else不是强制的,可省略;当然,当#else后需要嵌套#if时,可以使用预处理命令#elif,它相当于#else#if。

    小结:在程序中使用条件编译主要是为了方便程序的调试和移植。

    转载自:https://www.cnblogs.com/codingmengmeng/p/7221295.html

    展开全文
  • 头文件加#ifndef #define #endif
  • #ifndef的作用

    2019-09-29 20:23:31
    #ifndef的作用 定义 #define x //定义一个宏 … #endif //C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。 #ifndef x //先测试x是否被宏定义过 #define x...

    #ifndef的作用

    定义

    #define x //定义一个宏

    #endif
    //C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。
    #ifndef x //先测试x是否被宏定义过
    #define x
    程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1
    #else
    程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1
    #endif//终止if

    作用

    条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译。条件编译当然也可以用条件语句来实现, 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用#ifndef宏定义,一个c文件多次包含同一个h文件也不会报错。使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错。

    内容

    #ifndef 标识1 //判断"标识1"是否定义,如果被定义则返回假,如果没有被定义则返回真。
    /**********************************/
    语句1 #ifndef 标识1
    语句2 #define 标识1
    语句3 #endif
    语句4 ……
    语句5 ……
    该段代码意思是:如果标识1没有被定义,则重定义标识1,即执行语句2、语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……
    /***********************************/
    备注:#ifndef 和 #endif 要一起使用,如果丢失#endif,可能会报错。
    需要注意的是,#ifndef起到的效果是防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件。网上很多资料对这一细节的描述都是错误的。事实上,防止同一头文件被两个不同的源文件包含这种要求本身就是不合理的,头文件存在的价值就是被不同的源文件包含。
    假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。如果你在头文件A里定义了结构体或者类类型(这是最常见的情况),那么问题来了,编译时会报大量的重复定义错误。
    例如要编写头文件test.h,在头文件开头写上两行:
    #ifndef _TEST_H
    #define _TEST_H //一般是文件名的大写
    头文件结尾写上一行:
    #endif
    这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。
    分析:
    当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义了。
    而把头文件的内容都放在#ifndef和#endif中,则无论头文件会不会被多个文件引用,都需要加上这个。一般格式是这样的:
    #ifndef <标识>
    #define <标识>


    #endif
    <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前面加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
    #ifndef _STDIO_H
    #define _STDIO_H

    #endif

    形式

    “条件编译”命令允许对程序中的内容选择性地编译,即可以根据一定的条件选择是否编译。
    条件编译的命令主要有以下几种 :
    形式1
    #ifndef 标识符
    程序段 1
    #else
    程序段 2
    #endif
    它的作用是当“标识符”没有由#define定义过时,则编译“ 程序段1”,否则编译“程序段2” ,其中如果不需要编译“程序段2”。故上述形式可以变换为:
    #ifndef 标识符
    程序段 1
    #endif
    形式2
    #ifndef 标识符

    define 标识符

    程序段 1
    #else
    程序段 2
    #endif
    它的作用是当“标识符”没有由# define定义过。 则编译“程序段1”。否则编译“程序段2” ;同样当无“程序段2”时(作用与形式1完全相同),则上述形式变换为:
    #ifndef 标识符
    #define 标识符
    程序段 1
    #endif
    形式3
    #if 表达式
    程序段 1
    #else
    程序段 2
    #endif
    它的作用是当“表达式”值为真时。编译程序段1。否则则编译程序段2。同样,当无程序段2时,则上述形式变换为:
    #if 表达式
    程序段 1
    #endif
    以上三种形式的条件编译预处理结构都可以嵌套使用。 当#else后嵌套 #if 时,可以使用预处理命令 # elif , 它相当于#else #if。在程序中使用条件编译主要是为了方便程序的调试和移植。

    注:

    本文摘自百度百科,为何要copy下来,我是担心某一天它不在了我就没有参考的了。。。这个原文的链接:https://baike.baidu.com/item/%23ifndef?fr=aladdin

    展开全文
  • #ifndef以及#ifndef WIN32

    2021-03-15 17:48:43
    } //运行结果为:Beginning execution of main() // Press any key to continue 对于#ifndef Win32是指看你的工程有没有预先加入win32的宏定义 这个一般是根据你开始建立新工程时候有没有选择win32来决定的 经常在...

    一般用法是这样的:
    这里可以定义如下:
    #define XXXXX

    #ifdef XXXXX
    这里做一些操作,这些操作只有在XXXX已经被define的情况下才会执行到。一般还可能有else,如
    #else
    做另一些操作。。。
    #endif

    例子1:

    #include "iostream.h"
    int main()
    {
    #ifdef DEBUG     
    cout<< "Beginning execution of main()";
    #endif     
    return 0;
    }
    //运行结果为:Press any key to continue

    例子2:

     

    //改写代码如下:
    #include "iostream.h"
    #define DEBUG
    int main()
    {
    #ifdef DEBUG     
    cout<< "Beginning execution of main()";
    #endif      
    return 0;
    }
    //运行结果为:Beginning execution of main()
    //          Press any key to continue

     

    对于#ifndef Win32是指看你的工程有没有预先加入win32的宏定义

    这个一般是根据你开始建立新工程时候有没有选择win32来决定的

      经常在程序中碰到#ifdef WIN32这样的代码,实际上这提供了一种抽象机制,使代码可以在不同平台间移植. 下面给出一个简单的例子:

     

    #include<iostream>  
    using namespace std;  
      
    #ifdef WIN32  
    #define HAHA 1  
    #else  
    #define HAHA 0  
    #endif  
      
    int main()  
    {  
        int i = HAHA;  
        cout << i << endl;  
      
        return 0;  
    }

     

    如果你在windows平台下编译

    程序结果为:1

    展开全文
  • #ifndef用法

    千次阅读 多人点赞 2020-08-25 23:37:33
    背景: ...#ifndef __TEST_H #define __TEST_H " ...... #内容 ...... " 头文件结尾写上一行: #endif 原因: 防止重复被引用 举例说明: 假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h

    背景:

    最近工作上需要针对yolov5的tensorrt的接口进行编写,在看代码的时候遇到了一些问题,然后记录下来,每天进步一点点.

    困惑点:

    如下所示,代码中为什么要有这样的结构呢?

    编写头文件test.h时,在头文件开头写上两行,如下:
    #ifndef __TEST_H
    #define __TEST_H
    "
    ...... #内容
    ......
    "
    头文件结尾写上一行:
    #endif

    原因:

    防止重复被引用

    举例说明:

    假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h。  
    a.cpp的头部是:  
    #include   "b.h "  
    #include   "c.h "  
    b.h和c.h的头部都是:  
    #include   "d.h "  
    而d.h里面有class   D的定义。  
    这样一来,  
    编译器编译a.cpp的时候,先根据#include   "b.h "去编译b.h这个问题,再根据b.h里面的#include   "d.h ",去编译d.h的这个文件,这样就把d.h里面的class   D编译了;  
    然后再根据a.cpp的第二句#include   "c.h ",去编译c.h,最终还是会找到的d.h里面的class   D,但是class   D之前已经编译过了,所以就会报重定义错误。 加上ifndef/define/endif,就可以防止这种重定义错误。

    因此,不管你的头文件会不会被多个文件引用,你都要把头文件的内容放在#ifndef和#endif中。  

    使用说明:

    一般使用格式:

    #ifndef   <标识 >   
    #define   <标识 >   
    ......   
    ......   
    #endif   <标识 > 

    在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h   

    #ifndef   _STDIO_H_   
    #define   _STDIO_H_   
    ......   
    #endif 

    参考资料:

    https://blog.csdn.net/yapingmcu/article/details/8027473


     

    展开全文
  • 1、#ifndef "if not defined"的简写,是宏定义的一种,它是可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等。实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种——...
  • #ifndef的用法

    2020-11-03 20:17:39
     #ifndef x  #define x  ...  #endif  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的...
  • 条件编译 #if #ifdef #ifndef ... 的妙用详解_透彻

    千次阅读 多人点赞 2019-06-05 15:32:59
    本文主要介绍c语言中条件编译相关的预编译指令,包括#define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined。 #define 定义一个预处理宏 #undef 取消宏的定义 #if 编译预处理中的条件命令,相当于...
  • 关于ifndef...endif用法的详解和补充

    千次阅读 多人点赞 2020-03-19 23:32:35
    ** 具体示例 ...#ifndef x //先测试x是否被宏定义过 #define x 程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1 #else 程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1...
  • 宏定义#define #ifndef #endif

    千次阅读 多人点赞 2020-09-16 12:30:17
    #ifndef 条件编译 #define 宏定义 在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。“define”为宏定义命令。 被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的...
  • 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。 在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。 2....
  • 关于#ifndef以及#ifndef WIN32

    千次阅读 2019-09-21 22:06:15
    对于#ifndef Win32是指看你的工程有没有预先加入win32的宏定义 这个一般是根据你开始建立新工程时候有没有选择win32来决定的  经常在程序中碰到#ifdef WIN32这样的代码,实际上这提供了一种抽象机制,使代码...
  • ifndef的作用

    2019-08-15 15:25:30
    ifndef的作用 转载: include指令的缺陷,导致同一个头文件会被多次引入,使用ifndef可以避免多次引入。 ifndef是 if not define 的缩写,一种宏定义。它是预处理功能中三种(宏定义,文件包含和条件编译)中的第...
  • #ifndef def的作用

    2021-05-09 17:02:19
    解决办法 #ifndef TEST_MY_INFERENCE_ONNX_DETECTOR_H #define TEST_MY_INFERENCE_ONNX_DETECTOR_H // 在这里面定义函数 #endif //TEST_MY_INFERENCE_ONNX_DETECTOR_H 所以以后定义新的头文件都要定义一个独一无二的...
  • #ifndef _TEST_H // ifndef( if not define) #define _TEST_H //一般是文件名的大写 /* 中间有许多定义啦声明啦!;; */ #endif 简单理解 #ifndef _TEST_H 意思是: _TEST_H 如果没有定义,那么为真。 ...
  • #ifndef #define #endif的用法
  • 学习嵌入式开发的时候,遇到.h...#ifndef __DELAY_H #define __DELAY_H #ifndef __DELAY_H #define __DELAY_H #include "sys.h" void delay_s(u16 s); void delay_ms(u16 ms); void delay_us...
  • #ifdef,#else,#endif和#ifndef的用法
  • 1 #ifndef方式 2 #pragma once方式 同一个文件被include多次的危害: (1)防止重复定义的错误; (2)如果这个头文件变化,那么所有include这个文件的源文件都需要重新编译,即使没有去使用里面的任何内容 避免措施...
  • #if #ifdef和#ifndef用法 移位运算符的优先级高于条件运算符,重载是不能改变运算符优先级的,这点要注意,所以代码应当像下面这样调整,写宏的时候一定要注意优先级,尽量用括号来屏蔽运算符优先级。 #define ...
  •  其含义是:如果未定义#ifndef后面的“宏替换名”,则对“语句段1”进行编译;如果定义了#ifndef后面的“宏替换名”, 则对“语句段2”进行编译。   #include #define STR "diligence is the parent ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 287,783
精华内容 115,113
关键字:

ifndef