#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进去就可以看到了。
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;有什么区别,都是取别名啊?
#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 ==========
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 ==========
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即可。
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呢?
#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类型。
你也不应该需要取消。你可以自己定义MYBOOL,然后只使用MYBOOL类型。
#10
试了下,typedef确实不会定义一个符号。可是为什么偏偏VC下只有BOOL,INT64,UINT64,PINT64,PUINT64报错?既然VC报错,那么SDK里一定有
#define BOOL
之类的东西咯。说实话,我在Windows的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取别名,前后不一
-------------------------------------------
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呢? :)
bool true false 用起来多好啊,干嘛用呆头呆脑的大写BOOL呢? :)
#15
windef.h:
basetsd.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进去就可以看到了。
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;有什么区别,都是取别名啊?
#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 ==========
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 ==========
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即可。
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呢?
#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类型。
你也不应该需要取消。你可以自己定义MYBOOL,然后只使用MYBOOL类型。
#10
试了下,typedef确实不会定义一个符号。可是为什么偏偏VC下只有BOOL,INT64,UINT64,PINT64,PUINT64报错?既然VC报错,那么SDK里一定有
#define BOOL
之类的东西咯。说实话,我在Windows的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取别名,前后不一
-------------------------------------------
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呢? :)
bool true false 用起来多好啊,干嘛用呆头呆脑的大写BOOL呢? :)
#15
windef.h:
basetsd.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;