如何在Objective C++头文件中包含C++头文件?

16

我有一个.cpp/.hpp文件组合->.hpp文件中有#include..

我还有一个.mm/.h文件组合->如果我在我的.mm Objective C++文件中包含.hpp文件,就没有问题。但是,如果我尝试在我的.h (Objective C标头)文件中包含.hpp文件,则会出现预处理器问题“未找到iostream”。

除了使用一些花哨的东西,例如在我的Objective C .h文件中具有void*,然后将其转换为在.mm中包含的类型或将每个C++类型都包装在Objective C++类型中之外,是否有其他方法解决这个问题?

我的问题基本上与Tony的问题相同(但没有人回答他):

https://stackoverflow.com/questions/10163322/how-to-include-c-header-file-in-objective-c-header-file


1
为了让你的文件能够被其他非Objective-C++类包含,你必须避免在头文件中使用任何C++的包含/代码。这意味着你可能需要使用void*来存储成员变量。 - Joe
你正在询问语言A的编译器是否有有效的方式来编译语言B。通常情况下是不行的。Objective-C 可以使用 C 语言代码,Objective-C++ 代码可以使用 C++ 代码。但是 C 和 C++ 是不同的语言,因此必须非常严格地区分它们。 - Martin York
@LokiAstari - 其实,那不是我想问的 -> 我只使用Objective C++和C++。我的C++包括iostream(例如C++),而我的Objective C++头文件无法包含我的C++头文件,因为该头文件包含iostream。 - fatfreddyscat
@Joe - 感谢您的回答;如果您把它作为答案发布,我会将其标记为被接受的答案。但是,我绝对希望有一种更好的方法,而不是到处使用void*和强制转换... :/ - fatfreddyscat
2
@fatfreddyscat,我有更好的东西...使用不透明指针的答案 - Joe
@Joe -> 你太厉害了!!!请将其作为答案,我会接受它作为解决方案。 - fatfreddyscat
3个回答

26

问题在于您需要避免在头文件中使用所有C++语义,以允许普通的Objective-C类包含它。这可以通过使用不透明指针来实现。

CPPClass.h

class CPPClass
{
public:
    int getNumber()
    {
        return 10;
    }
};

ObjCPP.h

//Forward declare struct
struct CPPMembers;

@interface ObjCPP : NSObject
{
    //opaque pointer to store cpp members
    struct CPPMembers *_cppMembers;
}

@end

ObjCPP.mm

#import "ObjCPP.h"
#import "CPPClass.h"

struct CPPMembers {
    CPPClass member1;
};

@implementation ObjCPP

- (id)init
{
    self = [super init];
    if (self) {
        //Allocate storage for members
        _cppMembers = new CPPMembers;

        //usage
        NSLog(@"%d", _cppMembers->member1.getNumber());
    }

    return self;
}

- (void)dealloc
{
    //Free members even if ARC.
    delete _cppMembers;

    //If not ARC uncomment the following line
    //[super dealloc];
}

@end

这是一个很棒的回复!刚刚帮了我大忙! - ruoho ruotsi
我遇到了Objective-C++头文件侵入的问题。如果我有一个Objective-C++包装类,它的头文件包括C++头文件。然后我希望在其他Objective-C代码中使用这个包装对象,我导入包装类头文件,这将再次包括C++头文件。因此,所有我的类都需要变成Objective-C++。你如何解决这个问题? - silicontrip

4

要在Objective-C++头文件中使用C++,请确保:

  1. 有一个.h/.mm组合(Objective-C++)
  2. 在文件的标识中,将类型设置为Objective-C++源代码(它应该是自动的)
  3. 仅从Objective-C++源代码文件中包含所考虑的文件。这一点很明显,但很容易被快速遗忘并且难以追踪

0

#include指令只是简单地包含文本;唯一会导致Objective C抱怨的情况是在包含文件中存在无效的Objective C内容。

在您的情况下,它给出了答案;iostream.h头文件在Objective C中找不到。找到引用此文件的位置并将其#include删除。


不幸的是,我无法从.hpp文件中删除#include,因为它使用iostream中的某些类型。 - fatfreddyscat
这里有一个关于此问题的线程,似乎表明了一种解决方法:https://dev59.com/_FDTa4cB1Zd3GeqPLrgK - RonaldBarzell
感谢回复,但很遗憾对我不起作用,因为我正在将我的.hpp包含在Objective C++的.h文件中;我尝试将.h重命名为.mm并导入该文件,但那也不起作用。我还尝试将Objective C++ .h文件中的内容移动到.mm文件中,但那也没有起作用(当然,在长期运行中也没有帮助)。 - fatfreddyscat
你可以像C语言程序员多年来一直在做的那样,使用#ifdef (__cplusplus) - CodaFi
Joe在原问题的评论中给出的答案对我来说最好:https://dev59.com/73E95IYBdhLWcg3wkegf#2262395 - fatfreddyscat

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