我可以模仿一个C头重新定义C ++的布尔?

我正在编写一个程序,我真的更喜欢用C ++编写,但是,我需要包含一个重新定义bool的C头文件:

# define false 0 # define true 1 typedef int bool; 

显而易见的解决scheme是编辑标题说:

 #ifndef __cplusplus # define false 0 # define true 1 typedef int bool; #endif 

但是,唉,因为图书馆是只读的,我不能。

有没有办法告诉gcc忽略这个typedef? 或者,我可以用C ++编写大部分函数,​​然后为这两个编写一个C封装器? 或者,我应该把它吸起来,写在C的东西?

你可以破解它!

该库称为fooLib ,认为它使用了一些types的bool ,它有权限定义。 对图书馆来说, bool只是一个标识符。

所以,你可以强制它使用另一个标识符:

 #define bool fooLib_bool #include "fooLib.h" #undef bool #undef true #undef false 

现在编译器看到有问题的行转换为这个:

 typedef int fooLib_bool; 

你用typesfooLib_bool = int而不是真正的bool来接口,但是这是不可能的,因为代码可能实际上依赖于int的属性,并且库二进制文件会被编译成这样一个假设在。

我想你可以把有问题的代码包装成一个头,然后解开你不需要的东西

Library_wrapper.h:

 #define bool something_else // This will get you past the C++ compilation #include "library.h" #undef false #undef true #undef bool 

main.cpp中:

 #include "Library_wrapper.h" #include "boost.h" 

关于typedef ..如果你尝试在C ++中重新定义一个基本types,编译器应该抱怨。 您可以通过这种方式重新声明一个types(在C ++中允许)或者定义它(简单的文本replace)。

不幸的是,不,你不能在标准C ++中使用这个文件:

§7.1.3[dcl.typedef]

6 /在给定的范围内,不应使用typedef说明符重新定义在该范围内声明的任何types的名称,以指代不同的types。

因此typedef ... bool; 是禁止的。

§17.6.4.3.1[macro.names]

2 /翻译单位不得#定义或#undef与关键字词性相同的名称,表3中列出的标识符或7.6中描述的属性标记。

§2.12[lex.key]中,我们发现bool是一个关键字。

因此,在包含违规文件之前,试图通过使用#define bool ...来欺骗编译器是被禁止的。


那么,有什么select? 垫片!

在你自己的C&C ++兼容的头文件后面隔离那个有问题的库; 并将其编译为C.然后,您可以将自己的头文件包含在C ++程序中,而不会出现问题或技巧。

注意:是的,大多数编译器可能会接受#define bool ... ,但是它仍然被标准明确禁止。

您可以复制错误的标题并使用编辑后的副本。 告诉编译器它应该更喜欢的path和…

您可以编译使用标题为C的代码,然后将它与您的C ++对象文件连接起来。 你可能使用MSVC或GCC; 两者都可以将代码编译为C ++或C,并允许您创build兼容的对象文件。

这是一个干净的解决scheme还是不必要的过度杀伤真的取决于具体的情况。