type redefinition 的解决方法
我们的 engine 中定义了一个自己的类型叫做 boolean ,是这样定义的: typedef unsigned long int boolean;
我们的程序不主张使用 windows.h ,一直以来也没有去包含 windows.h
但是,今天包含 windows.h 时发现,boolean 被 redefinition 了。因为 C 语言里的 #ifdef 只能检查宏定义,而不能检查 typedef 定义,所以这个问题比较棘手。
当然,我不能修改 windows 系统头文件的内容;同样,我也不希望修改我们引擎的头文件。
实际上,如果多次 typedef 的类型完全一致的话,编译器是不会报错的。可惜 rpcndr.h 这个头文件中,是这样写的。 typedef unsigned char boolean;
下面是一个解决方案。
当然这样用的前提是,我知道我调用的所有 Windows API 都不会涉及 windows 定义的那个 boolean。
Comments
建议 C 代码一律用 C99 的
#include <stdbool.h>
bool 保证跟同一家的 C++ 一样宽
#define true 1
#define false 0
没有可以自己写一个。
Posted by: Anonymous | (10) January 19, 2007 02:01 AM
那个自动审核系统拒绝了我的留言。
给自己的名字加前缀是很普遍的做法。
比如lua的代码里的名字就都是lua_开头的,:)
Posted by: jason zhang
| (9)
September 4, 2006 06:09 PM
在没有namespace的C语言里,应该把所有自己的类型全部加上前缀。很著名的比如fucking_integer..出自某位天才同学...
Posted by: jason | (8) September 4, 2006 06:06 PM
怯怯地问一句:“ABI"是什么?
Posted by: 小样 | (7) August 7, 2006 10:08 PM
使用DEFINE,在预处理的时候包含不同的头文件。
Posted by: Anonymous | (6) April 24, 2006 04:04 PM
我也遇过这样的问题,特别常见的是有时想把逻辑和界面分开写代码,逻辑部分不想调用windows的任何东西,后来include到界面的时候,就出现重定义了,痛苦死了,曾经搞过把所有文件打开,把BOOLEAN替换成_BOOLEAN,但这样的方法太烂了,有没有什么好办法啊?
Posted by: 恋花蝶 | (5) March 23, 2006 11:12 AM
因为要做2进制复用的时候有 ABI 问题。 例如,mytypedef.h 里的声明是动态连接的,强加上 namespace 会连接失败。
Posted by: Cloud
| (4)
March 21, 2006 10:58 PM
不明白为什么一定要用pure C呢?用C++ Complier 加上namespace不是更好么,其他的又不用改动,总觉得你这么处理不是很舒服...
Posted by: Zenberg | (3) March 21, 2006 10:50 PM
有一种语言叫 C 语言 (半开玩笑 :D)
老实说, namespace 会引起 ABI 问题。
Posted by: Cloud
| (2)
March 21, 2006 02:05 PM
有一个关键字叫做namespace
Posted by: Atry | (1) March 21, 2006 12:46 PM