1

我在现有的 iOS 项目中添加了一些目标 C 文件和 c++ 文件。当我将 .mm 文件的 .h 文件导入具有相应 .m 文件的 .h 文件时,会出现各种错误。

当我将 .h 文件的 .m 文件更改为 .mm 导入新代码时,我会得到相同的先前错误,但新的 .mm 文件会出现新错误。

我不确定如何解决这个问题。

如果这有任何影响,我正在使用 ARC。

它抱怨命名空间(未知类型)、导入的 .mm 文件的未知名称问题、.mm 文件的 .h 文件中包含 :: 的语句的预期表达式错误。我没有得到的是这些文件在我从中复制它们的项目中正常工作。我只从项目中获取源代码。并在目录中添加了标题搜索路径。我还选择了创建对添加目录的引用选项。

由于某种原因,文件不在编译源部分中,当我尝试添加它们时,文件选择器树不包含我添加的这些源文件。添加的目录也是蓝色而不是黄色,但为空。

4

1 回答 1

3

如您所知,C++ 代码只能在 .mm 文件中使用。当编译器抱怨namespace是未知类型时,通常意味着在应该使用 Objective C++ 编译器时正在使用 Objective C 编译器。更简单地说:您有一个 .m 文件,它必须是 .mm。

一般来说,您可以选择两种选择。每次 Objective C 文件抱怨时,将其更改为 .mm。这是一个滑坡,通常会导致您的整个项目级联成一个巨大的 Objective C++ 球。另一种选择是隔离 C++,这样只有极少的 Objective C 文件需要 .mm 扩展名。

显然,后者是更好的选择。造成混淆的可能原因是#importing 一个头文件,其中包含来自应用程序其他地方的 C++ 代码,而实际上并不需要 C++。如果 C++ 是 Objective C 类的实现细节,您可以尝试通过利用类扩展将 C++ 保留在类的头文件之外。否则,您可以创建一个 Objective C 类,其唯一目的是将 C++ 包装在它自己的实现中,同时公开一个干净的头文件供其他类使用。

基本上,如果你能保持你的头文件干净,那么你就不必担心不小心将一些 C++ 间接地#importing 到一个毫无戒心的编译单元中。

于 2012-07-24T00:02:05.273 回答