在Objective-C中使用C ++,如何修复“冲突声明'typedef int BOOL'”?

时间:2011-08-12 22:30:41

标签: c++ objective-c declaration typedef objective-c++

我在C ++中有很多代码,最初是在PC上构建的。我试图在Mac上使用Objective-C。为此,我创建了一个Objective-C框架来存放C ++代码并添加了一个瘦包装器。但我在C ++代码中遇到了typedef问题。

当我在PC上使用C ++时,我使用了WinDef.h中定义的BOOL变量。因此,当我将所有内容移到Mac上时,我添加了typedef int BOOL;以确保BOOL变量仍然按预期编译。

但是当我尝试编译时,我收到一个错误:“Conflicting declaration 'typedef int BOOL'”。我假设这是因为BOOL是Objective-C中的关键字,因此已经定义了。我也不能只使用Objective-C BOOL,因为它是一个unsigned char而不是int。

在我寻找可能的解决方案时,我发现one提到取消定义BOOL ,但我找不到怎么做(我也不知道它是否真的有效)。 Another建议将C ++文件中的BOOL 重命名为非关键字。这个建议对我来说不是一个选择,因为其他项目依赖于C ++代码。理想情况下,我所做的任何更改都应保留在一个文件中,或者至少不应对Windows计算机上的代码产生负面影响。

如何为我的C ++文件取消定义BOOL的Objective-C定义并使用我添加的C ++定义?有没有更好的方法来解决这个问题?

如果它有助于我使用:Xcode 3.2.5,64位和Mac OS X 10.6.6

感谢任何指导!

4 个答案:

答案 0 :(得分:6)

我对一些讨论感到有些困惑,但是typedef int BOOL;而不仅仅是:{/ p>

#ifndef BOOL
  #define BOOL int
#endif

如果您使用的是typedef,那么#undef将无效,因为它们是两个不同的东西。 #define / #undef对执行替换的预处理程序符号进行操作,而typedef是创建另一种类型别名的语言的一部分。

预处理器符号在任何时候都可以是未定义的,因为它只是预处理器的一条指令,告诉它在执行替换时不再使用该定义。但是,typedef不能被定义,因为它是在特定范围内创建的,而不是使用预处理器发生的线性处理。 (以同样的方式,您不希望能够声明全局变量int x;,然后在代码中的某个时刻能够说'停止将x识别为变量'。)

我在答案中建议#define的原因是,只有在编译某些代码时才会命中ObjectiveC #define。这可能是一个解释,为什么当你删除typedef时你可能会在你的C ++中出错,但如果它存在则仍然会发生冲突。但是,如果假设是正确的,那么一旦你检查了在尝试定义它之前的定义,你应该能够在它们发生时避免相互冲突的定义。

最后一点:在这种特殊情况下,您也可以将typedef放入支票而不是#define。但是,我倾向于按照我这样做的方式去做,因为它是一个非常常见的习惯用法,并且因为该块也会阻止你在C ++代码中定义它两次,如果它最终包括两次。如果您非常喜欢typedef并且知道它不是代码中的问题,可能也不是非常令人信服的理由。 :)

答案 1 :(得分:0)

AFAIK,BOOL也是Objective-C中的#define。即使您设法

,也会遇到有冲突的BOOL定义问题
#undef BOOL

因为您的类型及其类型在大小和“签名”方面不一定匹配。你的BOOL真的必须是int,而不是Obj-C定义的那个吗?换句话说,你不能省略#define并简单地使用Obj-C吗?

答案 2 :(得分:0)

如果你能回到过去,我会说“不要在你自己的代码中使用typedef int BOOL”。

现在你实际上已经完成了它,但是你有点腌渍。通常,除了与外部代码接口外,您应该避免为自己的代码使用外部数据类型。标准类型很好,假设您可以保证在您定位的每个平台上使用标准兼容编译器进行编译。

最具前瞻性的解决方案是停止在平台无关的代码中使用BOOL作为类型。在此期间,您可以使用各种预处理程序hackery来使用BOOL编译,但如果您不以相同的方式使用BOOL,则可能会遇到一些奇怪的链接错误(通过#包括)无处不在。

答案 3 :(得分:0)

我使用cmake加载freeimage库,我正在使用kubuntu 14.x

我遇到了这个问题
"error: conflicting declaration ‘typedef CARD8 BOOL’" 

我认为与有这个问题的人分享我的解决方案会很好!

在Linux上安装FreeImage:

sudo apt-get install libfreeimage-dev

在我的CMakeLists.txt文件中,我有:

set(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY /usr/libs)
find_path(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY, FreeImage.h)
find_library(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY, freeimage)
include_directories(${FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY})
target_link_libraries(freeimage)

在我的main.cpp中,我有:

#include <FreeImage.h>
#ifndef CARD8
#define BYTE CARD8
#define BOOL CARD8
#endif

在磁盘上捕获OpenGl帧的一些额外代码:

void generateImage(){
  int w, h; // get the width and height of the OpenGL window!
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  GLubyte * pixels = new GLubyte[3*w*h];
  glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);

  FIBITMAP * image = FreeImage_ConvertFromRawBits(pixels,w,h,3 * w, 24, 0x0000FF, 0xFF0000, 0x00FF00, false);
  FreeImage_Save(FIF_BMP,image, "../img/text.bmp",0);

  //Free resource
  FreeImage_Unload(image);
  delete[] pixels;
}

我希望这可以帮助那些有问题的人!

此致 卡欣