« 资源的管理及加解锁 | 返回首页 | 一次大的重构 »

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;

下面是一个解决方案。

#include <windows.h>

typedef unsigned long int my_boolean;
#define boolean my_boolean

#include "mytypedef.h"

当然这样用的前提是,我知道我调用的所有 Windows API 都不会涉及 windows 定义的那个 boolean。

Comments

建议 C 代码一律用 C99 的

#include &lt;stdbool.h&gt;

bool 保证跟同一家的 C++ 一样宽
#define true 1
#define false 0

没有可以自己写一个。

那个自动审核系统拒绝了我的留言。
给自己的名字加前缀是很普遍的做法。
比如lua的代码里的名字就都是lua_开头的,:)

在没有namespace的C语言里,应该把所有自己的类型全部加上前缀。很著名的比如fucking_integer..出自某位天才同学...

怯怯地问一句:“ABI"是什么?

使用DEFINE,在预处理的时候包含不同的头文件。

我也遇过这样的问题,特别常见的是有时想把逻辑和界面分开写代码,逻辑部分不想调用windows的任何东西,后来include到界面的时候,就出现重定义了,痛苦死了,曾经搞过把所有文件打开,把BOOLEAN替换成_BOOLEAN,但这样的方法太烂了,有没有什么好办法啊?

因为要做2进制复用的时候有 ABI 问题。 例如,mytypedef.h 里的声明是动态连接的,强加上 namespace 会连接失败。


不明白为什么一定要用pure C呢?用C++ Complier 加上namespace不是更好么,其他的又不用改动,总觉得你这么处理不是很舒服...

有一种语言叫 C 语言 (半开玩笑 :D)

老实说, namespace 会引起 ABI 问题。

有一个关键字叫做namespace

Post a comment

非这个主题相关的留言请到:留言本