Luc*_*ain 9 c++ typedef declaration objective-c objective-c++
我在C++中有很多代码,最初是在PC上构建的.我试图在Mac上使用Objective-C.为此,我创建了一个Objective-C框架来存放C++代码并添加了一个瘦包装器.但是我在C++代码中遇到了typedef问题.
当我在PC上使用C++时,我使用了BOOL
WinDef.h中定义的变量.因此,当我将所有内容移到Mac上时,我添加了typedef int BOOL;
以确保BOOL
变量仍然按预期编译.
但是当我尝试编译时,我得到一个错误:" Conflicting declaration 'typedef int BOOL'
".我假设这是因为BOOL
Objective-C中的关键字,因此已经定义了.我也不能只使用Objective-C,BOOL
因为它是一个unsigned char而不是int.
当我在寻找可能的解决方案时,我找到了一个提到未定义BOOL的解决方案,但是我找不到怎么做(我也不知道它是否真的有效). 另一个建议将 C++文件中的BOOL重命名为非关键字.这个建议对我来说不是一个选择,因为其他项目依赖于C++代码.理想情况下,我所做的任何更改都应保留在一个文件中,或者至少不应对Windows计算机上的代码产生负面影响.
如何为我的C++文件取消定义BOOL的Objective-C定义并使用我添加的C++定义?有没有更好的方法来处理这个问题?
如果它有助于我使用:Xcode 3.2.5,64位和Mac OS X 10.6.6
谢谢你的指导!
我对一些讨论感到有些困惑,但typedef int BOOL;
不仅如此:
#ifndef BOOL
#define BOOL int
#endif
Run Code Online (Sandbox Code Playgroud)
如果你正在使用typedef
那么#undef
它将无法工作,因为它们是两个不同的东西.#define
/ #undef
对执行替换的预处理程序符号进行操作,而typedef是创建另一种类型别名的语言的一部分.
预处理器符号在任何时候都可以是未定义的,因为它只是预处理器的一条指令,告诉它在执行替换时不再使用该定义.但是,a typedef
不能是未定义的,因为它是在特定范围内创建的,而不是使用预处理器发生的线性处理.(以同样的方式,您不希望能够声明一个全局变量int x;
,然后在代码中的某个时刻能够说'停止将x识别为变量'.)
我在答案中建议#define的原因是,#define
只有在编译你的一些代码时,才有可能击中ObjectiveC .这可能是一个解释,为什么你在删除C++时可能会在C++中出现错误typedef
,但如果它存在则仍会产生冲突.但是,如果假设是正确的,那么一旦你在尝试之前检查了定义定义它,你应该能够避免发生冲突的定义.
最后要注意的是:在这种特殊情况下,你也可以把你的typedef
内部放入支票而不是#define
.但是,我倾向于按照我这样做的方式去做,因为它是一个非常常见的习惯用法,并且因为该块也会阻止你在C++代码中定义它两次,如果它最终包括两次.如果您非常喜欢typedef
并且知道它不是代码中的问题,可能也不是非常令人信服的理由.:)
归档时间: |
|
查看次数: |
4923 次 |
最近记录: |