我可以模仿一个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还是不必要的过度杀伤真的取决于具体的情况。
- “interfaceOrientation”在iOS 8中被弃用,如何改变这个方法Objective C
- 为什么document.querySelectorAll返回一个StaticNodeList而不是一个真正的数组?