在objective-c中使用std :: string作为datamember

时间:2012-07-24 22:23:55

标签: objective-c objective-c++ stdstring

我想在Objective-C代码中使用C ++字符串对象而不是NSString,所以我不需要转换它(我需要更频繁地使用std :: string)并尝试这样做:< / p>

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

2 个答案:

答案 0 :(得分:0)

重要的是包含此头文件的源文件。如果此头文件包含在普通的Objective-C源文件(.m扩展名)中,编译器将按照您的描述进行阻塞。如果您在Xcode中仔细检查错误,您可以确切地看到此头文件无法编译的源文件或文件。

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

@property (nonatomic, assign) string* trackName;

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

答案 1 :(得分:0)

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