郁闷啊,config.h在GCC下可以用在VC上却总是报BOOL重定义错误

时间:2022-03-03 12:48:02
#ifndef _CONFIG_H_
#define _CONFIG_H_
#ifdef WIN32
#include <windows.h>
#endif
#include <assert.h>
#include <limits.h>
#include <iostream>

#ifndef __cplusplus
typedef enum{FALSE,TRUE} BOOL;
#else
#ifndef BOOL
typedef bool BOOL;
#endif
#ifndef TRUE
#define TRUE true
#endif
#ifndef FALSE
#define FALSE false
#endif
#endif

#endif /* end of _CONFIG_H_ */
以上是我的头文件,没想到在gcc 下可以使用,但是在VC6和VC2008下都报BOOL重定义的错误,搞什么,明明有#ifndef BOOL的啊。望高手指点。

15 个解决方案

#1


把错误提示贴出来看看。

#2


VC里的BOOL不是宏,是一个自定义类型:
typedef long BOOL;
或typedef int BOOL;
装个VC助手,GO进去就可以看到了。

#3


#ifndef _CONFIG_H_
#define _CONFIG_H_
#ifdef WIN32
#include <windows.h>
#endif
#include <assert.h>
#include <limits.h>
#include <iostream>



#ifndef __cplusplus
typedef enum{FALSE,TRUE} BOOL;
#else
#ifndef BOOL
typedef bool BOOL;
#endif
#ifndef TRUE
#define TRUE true
#endif
#ifndef FALSE
#define FALSE false
#endif
#endif

#ifndef INT64
typedef long int INT64, *PINT64;
#endif
#ifndef UINT64
typedef unsigned long int UINT64, *PUINT64;
#endif

#endif /* end of _CONFIG_H_ */
唯独这几个不行,为什么?

typedef bool BOOL;跟typedef int BOOL;有什么区别,都是取别名啊?

#4


1>------ Build started: Project: test, Configuration: Release Win32 ------
1>Compiling...
1>stdafx.cpp
1>d:\test\stdafx.h(28) : error C2371: 'BOOL' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\windef.h(153) : see declaration of 'BOOL'
1>d:\test\stdafx.h(39) : error C2371: 'INT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'INT64'
1>d:\test\stdafx.h(39) : error C2371: 'PINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'PINT64'
1>d:\test\stdafx.h(42) : error C2371: 'UINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'UINT64'
1>d:\test\stdafx.h(42) : error C2371: 'PUINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'PUINT64'
1>Build log was saved at "file://d:\test\Release\BuildLog.htm"
1>test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

#5


1>------ Build started: Project: test, Configuration: Release Win32 ------
1>Compiling...
1>stdafx.cpp
1>d:\test\stdafx.h(28) : error C2371: 'BOOL' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\windef.h(153) : see declaration of 'BOOL'
1>d:\test\stdafx.h(39) : error C2371: 'INT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'INT64'
1>d:\test\stdafx.h(39) : error C2371: 'PINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'PINT64'
1>d:\test\stdafx.h(42) : error C2371: 'UINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'UINT64'
1>d:\test\stdafx.h(42) : error C2371: 'PUINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'PUINT64'
1>Build log was saved at "file://d:\test\Release\BuildLog.htm"
1>test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

#6


typedef不是define,用#ifdef在很多编译器上是检测不了的。
VC下有了你就把自己定义的删了就是了。
另外,既然C++了,就不要用BOOL了,只用bool即可。

#7


同意楼上

#8


的确是啊,那么为什么VC的其他部分可以呢?比如一下是正确的:
#ifndef BYTE
typedef unsigned char BYTE;
#endif
#ifndef INT8
typedef signed char         INT8, *PINT8;
#endif
#ifndef INT16
typedef signed short        INT16, *PINT16;
#endif
#ifndef INT32
typedef signed int          INT32, *PINT32;
#endif
#ifndef UINT8
typedef unsigned char       UINT8, *PUINT8;
#endif
#ifndef UINT16
typedef unsigned short      UINT16, *PUINT16;
#endif
#ifndef UINT32
typedef unsigned int        UINT32, *PUINT32;
#endif
在VC下编译通过。

那这么说来,如果某人typedef int BOOL;我岂不是不能取消BOOL,怎么重新定义BOOL呢?

#9


是的,你无法取消。
你也不应该需要取消。你可以自己定义MYBOOL,然后只使用MYBOOL类型。

#10


试了下,typedef确实不会定义一个符号。可是为什么偏偏VC下只有BOOL,INT64,UINT64,PINT64,PUINT64报错?既然VC报错,那么SDK里一定有
#define BOOL
之类的东西咯。说实话,我在Windows的SDK里找了很久,没有找到。下面是我的头文件全部代码:

#ifndef _CONFIG_H_
#define _CONFIG_H_

#include <iostream>
#ifdef WIN32
#include <windows.h>
#endif
#include <assert.h>
#include <limits.h>


#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

/* 声明输入参数 */
#ifndef IN
#define IN
#endif

/* 声明输出参数 */
#ifndef OUT
#define OUT
#endif

/* 声明可选参数 -通常指可以为NULL的指针参数,带默认值的参数不需要这样标明 */
#ifndef OPTIONAL
#define OPTIONAL
#endif

/* 声明保留参数,也就是暂时还不支持的参数 */
#ifndef RESERVED
#define RESERVED
#endif

/* 声明该参数的所有权将被被调用函数获取,调用者不再负责销毁参数指定的对象 */
#ifndef OWNER
#define OWNER
#endif

/* 声明该参数不再使用 */
#ifndef UNUSED
#define UNUSED
#endif

/* 声明需要注意的代码或参数 */
#ifndef REMARKABLE
#define REMARKABLE
#endif

/* 声明函数原型 */
#ifndef PROTOTYPE
#define PROTOTYPE
#endif

/* 表示尚未实现的接口、类、算法等 */
#ifndef TODO
#define TODO
#endif

/* 不建议使用的函数或类,应用新的函数或类代替它 */
#ifndef DEPRECATED
#define DEPRECATED
#endif

/* 标记为调试方便而临时增加的代码 */
#ifndef FOR_DBG
#define FOR_DBG
#endif

#ifndef TRUE
#define TRUE true
#endif
#ifndef FALSE
#define FALSE false
#endif

#ifndef CONST
#define CONST               const
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum{FALSE,TRUE} BOOL;
#else
#ifndef BOOL
typedef bool BOOL;
#endif
#endif


#ifndef VOID
typedef void VOID;
#endif
#ifndef SCHAR
typedef signed char SCHAR;
#endif
#ifndef UCHAR
typedef unsigned char UCHAR;
#endif
#ifdef __cplusplus
#ifndef WCHAR
typedef wchar_t WCHAR;
#endif
#endif
#ifndef BYTE
typedef unsigned char BYTE;
#endif
#ifndef INT8
typedef signed char         INT8, *PINT8;
#endif
#ifndef INT16
typedef signed short        INT16, *PINT16;
#endif
#ifndef INT32
typedef signed int          INT32, *PINT32;
#endif
#ifndef UINT8
typedef unsigned char       UINT8, *PUINT8;
#endif
#ifndef UINT16
typedef unsigned short      UINT16, *PUINT16;
#endif
#ifndef UINT32
typedef unsigned int        UINT32, *PUINT32;
#endif
#ifndef INT64
typedef long int INT64, *PINT64;
#endif
#ifndef UINT64
typedef unsigned long int UINT64, *PUINT64;
#endif
#ifndef FLOAT
typedef float FLOAT;
#endif
#ifndef DOUBLE
typedef double DOUBLE;
#endif

static const INT8 INT8_MAX = SCHAR_MAX;
static const INT8 INT8_MIN = SCHAR_MIN;
static const UINT8 UINT8_MAX= UCHAR_MAX;

static const INT16 INT16_MAX = SHRT_MAX;
static const INT16 INT16_MIN = SHRT_MIN;
static const UINT16 UINT16_MAX = USHRT_MAX;

static const INT32 INT32_MAX = INT_MAX;
static const INT32 INT32_MIN = INT_MIN;
static const UINT32 UINT32_MAX = UINT_MAX;

#ifdef __cplusplus
}
#endif

#undef TRACE
#define TRACE(x) (std::cout << #x << ": " << x << std::endl)

#endif /* end of _CONFIG_H_ */

#11


就不要浪费时间了。找到了你也还是没解决问题。

#12


#undef

#13


试了下,typedef确实不会定义一个符号。可是为什么偏偏VC下只有BOOL,INT64,UINT64,PINT64,PUINT64报错?既然VC报错,那么SDK里一定有 #define   BOOL 之类的东西咯
------------------------------------------- 
     2楼已经明确指出VC中的BOOL,是typedef int BOOL,而不是define
     typedef不会定义一个符号, 
     因此你源代码中的#ifndef BOOL 检测无效
      因此你的源代码编译时会到 typedef bool BOOL; 从而与VC本身的typedef int BOOL; 冲突了

回答LZ第8楼所问
     #ifndef   BYTE                     //同理,这里检测仍然无效
    typedef   unsigned   char   BYTE;   //同里,这里再次typdef,LZ纳闷了吧,这里没冲突
    #endif                              //因为两次都是为unsigned char取别名
                                              //而不像你的BOOL那样,VC为int取别名,你自己为bool取别名,前后不一

#14


#undef BOOL试试

bool true false 用起来多好啊,干嘛用呆头呆脑的大写BOOL呢? :)

#15


windef.h:

typedef int                 BOOL;

basetsd.h
typedef signed char         INT8, *PINT8;
typedef signed short        INT16, *PINT16;
typedef signed int          INT32, *PINT32;
typedef signed __int64      INT64, *PINT64;
typedef unsigned char       UINT8, *PUINT8;
typedef unsigned short      UINT16, *PUINT16;
typedef unsigned int        UINT32, *PUINT32;
typedef unsigned __int64    UINT64, *PUINT64;

#1


把错误提示贴出来看看。

#2


VC里的BOOL不是宏,是一个自定义类型:
typedef long BOOL;
或typedef int BOOL;
装个VC助手,GO进去就可以看到了。

#3


#ifndef _CONFIG_H_
#define _CONFIG_H_
#ifdef WIN32
#include <windows.h>
#endif
#include <assert.h>
#include <limits.h>
#include <iostream>



#ifndef __cplusplus
typedef enum{FALSE,TRUE} BOOL;
#else
#ifndef BOOL
typedef bool BOOL;
#endif
#ifndef TRUE
#define TRUE true
#endif
#ifndef FALSE
#define FALSE false
#endif
#endif

#ifndef INT64
typedef long int INT64, *PINT64;
#endif
#ifndef UINT64
typedef unsigned long int UINT64, *PUINT64;
#endif

#endif /* end of _CONFIG_H_ */
唯独这几个不行,为什么?

typedef bool BOOL;跟typedef int BOOL;有什么区别,都是取别名啊?

#4


1>------ Build started: Project: test, Configuration: Release Win32 ------
1>Compiling...
1>stdafx.cpp
1>d:\test\stdafx.h(28) : error C2371: 'BOOL' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\windef.h(153) : see declaration of 'BOOL'
1>d:\test\stdafx.h(39) : error C2371: 'INT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'INT64'
1>d:\test\stdafx.h(39) : error C2371: 'PINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'PINT64'
1>d:\test\stdafx.h(42) : error C2371: 'UINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'UINT64'
1>d:\test\stdafx.h(42) : error C2371: 'PUINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'PUINT64'
1>Build log was saved at "file://d:\test\Release\BuildLog.htm"
1>test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

#5


1>------ Build started: Project: test, Configuration: Release Win32 ------
1>Compiling...
1>stdafx.cpp
1>d:\test\stdafx.h(28) : error C2371: 'BOOL' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\windef.h(153) : see declaration of 'BOOL'
1>d:\test\stdafx.h(39) : error C2371: 'INT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'INT64'
1>d:\test\stdafx.h(39) : error C2371: 'PINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(79) : see declaration of 'PINT64'
1>d:\test\stdafx.h(42) : error C2371: 'UINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'UINT64'
1>d:\test\stdafx.h(42) : error C2371: 'PUINT64' : redefinition; different basic types
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(83) : see declaration of 'PUINT64'
1>Build log was saved at "file://d:\test\Release\BuildLog.htm"
1>test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

#6


typedef不是define,用#ifdef在很多编译器上是检测不了的。
VC下有了你就把自己定义的删了就是了。
另外,既然C++了,就不要用BOOL了,只用bool即可。

#7


同意楼上

#8


的确是啊,那么为什么VC的其他部分可以呢?比如一下是正确的:
#ifndef BYTE
typedef unsigned char BYTE;
#endif
#ifndef INT8
typedef signed char         INT8, *PINT8;
#endif
#ifndef INT16
typedef signed short        INT16, *PINT16;
#endif
#ifndef INT32
typedef signed int          INT32, *PINT32;
#endif
#ifndef UINT8
typedef unsigned char       UINT8, *PUINT8;
#endif
#ifndef UINT16
typedef unsigned short      UINT16, *PUINT16;
#endif
#ifndef UINT32
typedef unsigned int        UINT32, *PUINT32;
#endif
在VC下编译通过。

那这么说来,如果某人typedef int BOOL;我岂不是不能取消BOOL,怎么重新定义BOOL呢?

#9


是的,你无法取消。
你也不应该需要取消。你可以自己定义MYBOOL,然后只使用MYBOOL类型。

#10


试了下,typedef确实不会定义一个符号。可是为什么偏偏VC下只有BOOL,INT64,UINT64,PINT64,PUINT64报错?既然VC报错,那么SDK里一定有
#define BOOL
之类的东西咯。说实话,我在Windows的SDK里找了很久,没有找到。下面是我的头文件全部代码:

#ifndef _CONFIG_H_
#define _CONFIG_H_

#include <iostream>
#ifdef WIN32
#include <windows.h>
#endif
#include <assert.h>
#include <limits.h>


#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

/* 声明输入参数 */
#ifndef IN
#define IN
#endif

/* 声明输出参数 */
#ifndef OUT
#define OUT
#endif

/* 声明可选参数 -通常指可以为NULL的指针参数,带默认值的参数不需要这样标明 */
#ifndef OPTIONAL
#define OPTIONAL
#endif

/* 声明保留参数,也就是暂时还不支持的参数 */
#ifndef RESERVED
#define RESERVED
#endif

/* 声明该参数的所有权将被被调用函数获取,调用者不再负责销毁参数指定的对象 */
#ifndef OWNER
#define OWNER
#endif

/* 声明该参数不再使用 */
#ifndef UNUSED
#define UNUSED
#endif

/* 声明需要注意的代码或参数 */
#ifndef REMARKABLE
#define REMARKABLE
#endif

/* 声明函数原型 */
#ifndef PROTOTYPE
#define PROTOTYPE
#endif

/* 表示尚未实现的接口、类、算法等 */
#ifndef TODO
#define TODO
#endif

/* 不建议使用的函数或类,应用新的函数或类代替它 */
#ifndef DEPRECATED
#define DEPRECATED
#endif

/* 标记为调试方便而临时增加的代码 */
#ifndef FOR_DBG
#define FOR_DBG
#endif

#ifndef TRUE
#define TRUE true
#endif
#ifndef FALSE
#define FALSE false
#endif

#ifndef CONST
#define CONST               const
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum{FALSE,TRUE} BOOL;
#else
#ifndef BOOL
typedef bool BOOL;
#endif
#endif


#ifndef VOID
typedef void VOID;
#endif
#ifndef SCHAR
typedef signed char SCHAR;
#endif
#ifndef UCHAR
typedef unsigned char UCHAR;
#endif
#ifdef __cplusplus
#ifndef WCHAR
typedef wchar_t WCHAR;
#endif
#endif
#ifndef BYTE
typedef unsigned char BYTE;
#endif
#ifndef INT8
typedef signed char         INT8, *PINT8;
#endif
#ifndef INT16
typedef signed short        INT16, *PINT16;
#endif
#ifndef INT32
typedef signed int          INT32, *PINT32;
#endif
#ifndef UINT8
typedef unsigned char       UINT8, *PUINT8;
#endif
#ifndef UINT16
typedef unsigned short      UINT16, *PUINT16;
#endif
#ifndef UINT32
typedef unsigned int        UINT32, *PUINT32;
#endif
#ifndef INT64
typedef long int INT64, *PINT64;
#endif
#ifndef UINT64
typedef unsigned long int UINT64, *PUINT64;
#endif
#ifndef FLOAT
typedef float FLOAT;
#endif
#ifndef DOUBLE
typedef double DOUBLE;
#endif

static const INT8 INT8_MAX = SCHAR_MAX;
static const INT8 INT8_MIN = SCHAR_MIN;
static const UINT8 UINT8_MAX= UCHAR_MAX;

static const INT16 INT16_MAX = SHRT_MAX;
static const INT16 INT16_MIN = SHRT_MIN;
static const UINT16 UINT16_MAX = USHRT_MAX;

static const INT32 INT32_MAX = INT_MAX;
static const INT32 INT32_MIN = INT_MIN;
static const UINT32 UINT32_MAX = UINT_MAX;

#ifdef __cplusplus
}
#endif

#undef TRACE
#define TRACE(x) (std::cout << #x << ": " << x << std::endl)

#endif /* end of _CONFIG_H_ */

#11


就不要浪费时间了。找到了你也还是没解决问题。

#12


#undef

#13


试了下,typedef确实不会定义一个符号。可是为什么偏偏VC下只有BOOL,INT64,UINT64,PINT64,PUINT64报错?既然VC报错,那么SDK里一定有 #define   BOOL 之类的东西咯
------------------------------------------- 
     2楼已经明确指出VC中的BOOL,是typedef int BOOL,而不是define
     typedef不会定义一个符号, 
     因此你源代码中的#ifndef BOOL 检测无效
      因此你的源代码编译时会到 typedef bool BOOL; 从而与VC本身的typedef int BOOL; 冲突了

回答LZ第8楼所问
     #ifndef   BYTE                     //同理,这里检测仍然无效
    typedef   unsigned   char   BYTE;   //同里,这里再次typdef,LZ纳闷了吧,这里没冲突
    #endif                              //因为两次都是为unsigned char取别名
                                              //而不像你的BOOL那样,VC为int取别名,你自己为bool取别名,前后不一

#14


#undef BOOL试试

bool true false 用起来多好啊,干嘛用呆头呆脑的大写BOOL呢? :)

#15


windef.h:

typedef int                 BOOL;

basetsd.h
typedef signed char         INT8, *PINT8;
typedef signed short        INT16, *PINT16;
typedef signed int          INT32, *PINT32;
typedef signed __int64      INT64, *PINT64;
typedef unsigned char       UINT8, *PUINT8;
typedef unsigned short      UINT16, *PUINT16;
typedef unsigned int        UINT32, *PUINT32;
typedef unsigned __int64    UINT64, *PUINT64;