在Xcode中编译#include <cstdlib> - 编译时出现错误:找不到文件

3
我在我的项目中添加了一个框架,为了获取框架的回调,我需要实现C++代码,因此我添加了C++类,这些类是.mm格式而不是.cpp格式。 根据此链接提供的建议 我还看到了一些StackOverflow帖子,在那里我发现我要么选择C++源类型,要么选择Objective C源类型(根据几位成员的建议)。
我想将C++代码与Objective C类一起编译,但我得到了“文件未找到”错误(编译时)#include <cstdlib> and #include <string>
请让我知道有没有人解决过这个问题或遇到过同样的问题。
先行致谢!

你试图编译的源文件的扩展名是什么? - JBL
感谢JBL的回复。扩展名是“.h”,这个文件是C头文件类型。 - Sandeep Khade
那是头文件,源文件的扩展名是什么?.m还是.mm - JBL
正如我在问题中提到的那样,将源文件.mm。 - Sandeep Khade
1个回答

5

我认为问题在于您的.h文件中添加了C++包含项,并且该文件被包含在其他.m文件中,而不仅仅是.mm文件中。 解决此问题的方法有几种:

  1. Use C++ includes only in .mm files. (don't use them in .h)
  2. Change all files, that import yours header to .mm
  3. Include them in

    #ifdef __cplusplus
    #endif
    

块。还可以将此块用于提到C++类的方法。例如:

#ifdef __cplusplus
#include <string>
using namespace std;
#endif

@interface SomeClass

#ifdef __cplusplus
- (void) setName:(const string&) name;
#endif

@end

另外,避免使用#ifdef #endif代码块的方法是使用扩展和分类:

  1. 只在扩展中声明C++的实例变量。
  2. 创建具有额外.h文件的分类,用于使用C++类型的方法和属性。

1
如果Objective-C类声明为使用std::string,那么唯一的选择是1或2。其他所有选项都会以某种方式失败。 - trojanfoe
@trojanfoe,您的意思是将std::string用作实例变量吗? - Cy-4AH
或者参数。如果Objective-C类使用了C++类,那么它只对其他Objective-C++类有用,因此使用__cplusplus保护也没什么用。+1,你走在了正确的轨道上。 - trojanfoe
@trojanfoe,选项3也可以。因为你只会在.mm文件中评估这些属性和方法。我在Objective-C++工作经验中进行了测试。 - Cy-4AH
是的,它可能会起作用,但有点过于复杂了。如果在任何情况下都使用C++,我通常会将所有内容都设置为.mm,因为这样可以简化事情。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接