#if !defined()#define

本文介绍了两种防止头文件被重复包含的方法:使用 #ifndef 宏定义和 #pragma once。详细对比了两者的优缺点,并给出了一种兼容性的解决方案。
为了避免同一个文件被include多次

 #ifndef方式
 #pragma once方式

在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
    方式一:

    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 一些声明语句
    #endif

    方式二:

    #pragma once
    ... ... // 一些声明语句


    #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

    #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

  方式一由语言支持所以移植性好,方式二 可以避免名字冲突。

一般可以这样处理:
#infndef XX
#define XX
    #if _MSC_VER > 1000
        #pragma once
    #endif
    .
    .
#endif
注意:  _MSC_VER 是出于版本兼容性考虑,定义
                Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined.
/** * @file * @brief Platform Configuration */ #ifndef _AP4_CONFIG_H_ #define _AP4_CONFIG_H_ /*---------------------------------------------------------------------- | defaults +---------------------------------------------------------------------*/ #define AP4_CONFIG_HAVE_STDIO_H #define AP4_CONFIG_HAVE_ASSERT_H #define AP4_CONFIG_HAVE_STRING_H #define AP4_CONFIG_HAVE_SNPRINTF #define AP4_CONFIG_HAVE_VSNPRINTF #define AP4_CONFIG_HAVE_INT64 /*---------------------------------------------------------------------- | byte order +---------------------------------------------------------------------*/ // define AP4_PLATFORM_BYTE_ORDER to one of these two choices #define AP4_PLATFORM_BYTE_ORDER_BIG_ENDIAN 0 #define AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN 1 #if !defined(AP4_PLATFORM_BYTE_ORDER) #if defined(__ppc__) #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_BIG_ENDIAN #elif defined(_MSC_VER) #if defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64) #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN #endif #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__) #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN #endif #endif /*---------------------------------------------------------------------- | standard C++ runtime +---------------------------------------------------------------------*/ #define APT_CONFIG_HAVE_NEW_H /*---------------------------------------------------------------------- | platform specifics +---------------------------------------------------------------------*/ /* Microsoft Platforms */ #if defined(_MSC_VER) #define AP4_CONFIG_INT64_TYPE __int64 #if (_MSC_VER >= 1400) && !defined(_WIN32_WCE) #define AP4_CONFIG_HAVE_FOPEN_S #define AP4_snprintf(s,c,f,...) _snprintf_s(s,c,_TRUNCATE,f,__VA_ARGS__) #define AP4_vsnprintf(s,c,f,a) _vsnprintf_s(s,c,_TRUNCATE,f,a) #define fileno _fileno #define AP4_fseek _fseeki64 #define AP4_ftell _ftelli64 #else #define AP4_snprintf _snprintf #define AP4_vsnprintf _vsnprintf #endif #if defined(_WIN32_WCE) #define AP4_fseek fseek #define AP4_ftell ftell #endif #if defined(_DEBUG) #define _CRTDBG_MAP_ALLOC #endif #endif /* Cygwin */ #if defined(__CYGWIN__) #define AP4_fseek fseek #define AP4_ftell ftell #endif /* Symbian */ #if defined(__SYMBIAN32__) #undef APT_CONFIG_HAVE_NEW_H #include "e32std.h" /** * Define the Platform byte order here * for Symbian. */ #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN #define AP4_fseek fseek #define AP4_ftell ftell #define explicit #endif /* Android */ #if defined(ANDROID) #if !defined(AP4_CONFIG_NO_RTTI) #define AP4_CONFIG_NO_RTTI #endif #if !defined(AP4_CONFIG_NO_EXCEPTIONS) #define AP4_CONFIG_NO_EXCEPTIONS #endif #endif /* Emscripten */ #ifdef __EMSCRIPTEN__ #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN #endif /*---------------------------------------------------------------------- | defaults +---------------------------------------------------------------------*/ #if !defined(AP4_CONFIG_INT64_TYPE) #define AP4_CONFIG_INT64_TYPE long long #endif #if !defined(AP4_fseek) #define AP4_fseek fseeko #endif #if !defined(AP4_ftell) #define AP4_ftell ftello #endif /* some compilers (ex: MSVC 8) deprecate those, so we rename them */ #if !defined(AP4_snprintf) #define AP4_snprintf snprintf #endif #if !defined(AP4_vsnprintf) #define AP4_vsnprintf vsnprintf #endif #endif // _AP4_CONFIG_H_ 详细注释上述代码
09-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值