0

我想在我的 Objective-C 代码中使用 C++ 字符串对象而不是 NSString,所以我不需要隐藏它(我更经常需要 std::string),我尝试这样做:

using namespace std;

@interface InstrumentGridViewController : UIViewController {   
string* trackName; // also tried using std::string, didn't work
@property (nonatomic, assign) string* trackName;
}

不过,我遇到了错误,string* trackName;语句和@property行都给了我Expected specifier-qualifier-list 'string'.

编辑:我忘了添加#include <string>,但添加这给了我错误String: no such file or directory

4

2 回答 2

0

重要的是包含此头文件的源文件。如果此头文件包含在普通的 Objective-C 源文件(.m 扩展名)中,编译器将如您所描述的那样阻塞。如果你仔细检查 Xcode 中的错误,你可以准确地看到这个头文件在哪个或哪些源文件中编译失败。

这就是为什么经常建议不要在旨在供 Objective C 代码使用的头文件中使用 C++ 对象的原因。头文件中的 C++ 往往会在您的代码库中流血,并迫使您编译所有目标 C++(.mm 扩展名)。请注意,使用现代运行时和类扩展,很容易解决这个问题。只需移动您的:

@property (nonatomic, assign) string* trackName;

到 InstrumentGridViewController.mm 文件中的类扩展,并删除trackName现代运行时不需要的 ivar 声明。然后,您的标头是 Objective C 干净的,并且可以包含在您的其余代码中。Rob Napier 在Wrapping C++ Final Edition中有更多讨论。

于 2012-07-24T23:01:02.673 回答
0

如果您想将所有内容编译为 Obj-c++ 并且不想经历更改所有文件扩展名的繁琐过程,只需将-x objective-c++标志提供给编译器(项目设置 -> 其他 c 标志)并与 stdlibc++ 链接。这样您就可以使用 c++ 所有其他代码而无需担心

于 2012-07-25T16:48:52.790 回答