【问题标题】:Cascade of Objective c syntax errors when including c++ library in an objective c++ file将 c++ 库包含在目标 c++ 文件中时,目标 c 语法错误的级联
【发布时间】:2014-07-08 01:07:41
【问题描述】:

这是我的第一篇文章,如果我没有遵守任何发帖惯例,请原谅我。 我一直在开发一个在 OSX 10.7.5 上使用 xcode 4.6.2 中的“Cocoa/Objective C”前端的应用程序,并通过 Objective c++ 适配器类访问 c++ 库。 这是一个陡峭的学习曲线,但事情进展顺利。我现在遇到了一个绊脚石,我希望这里有人知道如何解决。

我最近在我的 c++ 后端中包含了一个新库,它在我的“仅限 C++”后端实验 xcode 项目中完美运行。但是当我尝试编译我的ObjC/Objc++/C++ 版本时,我在Objective C++ 文件中遇到级联语法错误,大致如下:

In Objc++.mm:
#include "objCclass.h"    //no problem here
#include "CppBackend.h"   //c++ libs included by this file cause the following errors:

@interface objCclass ()   //!unexpected '@' in program
-(id)classmethods      //(class extension to allow access to c++ backend)
@end                  //!end must appear in an objective c context

//etc,etc....
@synthesize x,y,z;   //!Missing context for property implementation declaration
//errors on most lines that work fine when CppBackend.h is not included

Other 因此,类似主题的帖子表明经常出现导致此问题的愚蠢语法错误,但我认为这里并非如此。我的 Cocoa 前端在没有后端包含的情况下工作,而后端在纯 c++ 项目中完美地工作。

如果有任何帮助,我将不胜感激。非常感谢这里的人们为这个问题和其他问题提供的所有帮助。

马克

更新 - 我发现如果我注释掉类扩展(并删除任何子序列依赖问题) - 它可以工作!会不会是 ObjC++ 编译器出现了不喜欢看到类扩展的问题?

【问题讨论】:

  • 试着写一个包含#include "CppBackend.h"的文件,然后看看它是否同时编译为C++和Objective-C++。
  • 您确定文件类型设置为Objective C++ 对吧? i.stack.imgur.com/ogeaF.png 用于 Xcode 4。
  • 感谢您的快速回复。 Dietrich - 我制作了一个新的、空的 Cocoa 应用程序,更改为 AppDelegate.mm,包含 backend.h,它似乎可以编译,这真是个好消息,我猜这意味着问题出在我的项目中而不是固有的问题库不兼容。我很高兴发现了这一点。不知道下一步该怎么做.....
  • 您的包含文件没有干净地结束。最后有一个悬而未决的声明。
  • 我已经多次看到此类问题。通常在包含结尾附近缺少};。可能会被 #if 语句混淆,这些语句会根据情况为您提供不同的流程。如果错误在包含内的包含内,则可能会令人困惑。有些东西会编译正确,有些则不会。甚至会导致后面的语句被“吞下”的“沉默”问题。

标签: c++ objective-c xcode cocoa objective-c++


【解决方案1】:

要对抗预处理器错误,您需要查看其实际输出。

在 Xcode 中,选择有问题的源文件,单击源窗格左上角的“相关文件”按钮,然后单击“预处理”。

【讨论】:

  • 谢谢。您有关于如何诊断此预处理器输出的提示吗?
  • @MarcSpecter Preprocessing 生成包含所有头文件的单个输出文件。您可以在其中查找有问题的行(通过搜索错误消息中显示的关键字)。或者,将其保存为另一个 .mm 文件并编译,以查看拼写错误从哪里开始(如果确实是拼写问题)。
  • 谢谢。我会继续寻找。我真的认为这不是一个错字问题。不过很高兴错了:)
  • 编译预处理后的输出会产生许多 typedef 重定义错误
【解决方案2】:

我已经解决了这个问题。

我试图包含的 c++ 库声明了一个 typedef“接口”,我认为这确实扰乱了目标 c 的“@interface”。我将 typedef 和所有后续使用重命名为“_interface”,现在一切正常!!!

非常感谢所有为此提供帮助的人。我有一种直观的感觉,这不是语法错误,而是两个库之间的某种冲突。

:):):):):):):):):)

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多