【问题标题】:How to include C++ headers in an Objective C++ header?如何在 Objective C++ 标头中包含 C++ 标头?
【发布时间】:2012-12-03 20:56:12
【问题描述】:

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

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

除了做一些时髦的事情,比如在我的 Objective C .h 文件中有一个 void* 然后将其转换为包含在 .mm 中的类型或将每个 C++ 类型包装在一个 Objective C++ 类型中之外,还有什么办法可以解决这个问题?

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

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

【问题讨论】:

  • 您必须避免在您的头文件中包含任何 C++ 包含/代码,以便您的文件包含在其他非 Objective-C++ 类中。这意味着您可能需要使用 void* 来存储成员变量。
  • 您在问语言A的编译器是否有有效的方法来编译语言B。通常没有。 Objective-C 可以使用 C 代码。 Objective-C++ 代码可以使用 C++ 代码。但是 C 和 C++ 是不同的语言,所以要严格区分它们。
  • @LokiAstari - 实际上,这不是我要问的 -> 我只使用了 Objective C++ 和 C++。我的 C++ 包含 iostream(例如 C++),而我的 Objective C++ 头文件不能包含我的 C++ 头文件,因为该头文件包含 iostream。
  • @Joe - 感谢您的回答;如果您将其作为答案,我会将其标记为已接受。但是,我绝对希望有一种更好的方法来使用 void* 并在任何地方进行强制转换...:/
  • @fatfreddyscat 我有更好的东西.. answer 使用不透明的指针。

标签: c++ ios import include objective-c++


【解决方案1】:

问题是你必须避免头文件中的所有 C++ 语义,以允许普通的 Objective-C 类包含它。这可以使用opaque pointers 来完成。

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

【讨论】:

  • 谢谢!你摇滚!接受!
  • 这是一个很好的回应!刚刚帮了我一把!
  • 我遇到了objective-c++ 标题蠕变的问题。如果我有一个 Objective-C++ 包装类,它的头文件包括 C++ 头文件。然后我希望在其他objective-c代码中使用这个包装器对象,我导入了包装器类头,它又包含c++。因此要求我所有的课程都变成objective-c++。你如何阻止这种情况?
【解决方案2】:

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

  1. 有一对 .h/.mm (Objective-C++)
  2. 在文件的标识中,将类型设置为 Objective-C++ Source(应该是自动的)
  3. 仅包含来自 Objective-C++ 源文件的考虑文件。这一点很明显,但很快就会被遗忘且难以追查

【讨论】:

    【解决方案3】:

    #include 指令只包含文本; Objective C 唯一会抱怨的是,如果包含文件中的某些内容不是有效的 Objective C。

    在你的情况下,它会给你答案;在 Objective C 中找不到 iostream.h 头文件。找到该文件的引用位置并删除它的#include。

    【讨论】:

    • 不幸的是,我无法删除 .hpp 文件中的#include,因为它在 iostream 中使用了某些类型。
    • 好吧,这里有一个主题似乎表明解决方法:stackoverflow.com/questions/3794931/…
    • -> 感谢您的回复,但不幸的是,这对我不起作用,因为我将 .hpp 包含在 Objective C++ .h 文件中;我尝试将 .h 重命名为 .mm 并导入它,但这不起作用。我还尝试将 Objective C++ .h 文件中的内容移动到 .mm 文件中,但这也不起作用(当然从长远来看也无济于事)。
    • 你可以做 c 人多年来一直在做的事情,#ifdef (__cplusplus)
    • 乔的回答(对原始问题的评论)最适合我:stackoverflow.com/a/2262395/418715
    猜你喜欢
    • 2014-07-28
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多