web-dev-qa-db-ja.com

Objective C、(*。m、* .mm&.c /.cpp)ファイルのミキシング

私のプロジェクトでは、コアライブラリはC/C++ファイルの一部ですが、UIはObjective Cで開発する必要がありますが、Objective C /.mmファイルからC++関数にアクセス/呼び出すことはできますが、今のところうまくいきません。システムヘッダーでさえObjectiveCヘッダーを含めようとしたときに、C++ファイルからObjectiveC関数を呼び出すことができます

#import <foundation/foundation.h> 

約1000以上のコンパイルエラーが発生し、

このようなもの

/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180: error: expected unqualified-id before '@' token


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182: error: expected initializer before '*' token


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'NSString' was not declared in this scope


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'aSelectorName' was not declared in this scope

コンパイル前のフラグなどが不足していますか?C++コードをあまり変更せずに、NSObjectから継承されたObjective Cクラスを呼び出し/アクセスするための最良の方法を誰かが提案できますか?1つの関数を呼び出すだけです

コード構造/ヘッダーファイルをインクルードする順序は

Some system header file
Some Core Class Header file 

#import <foundation/foundation.h>
14
Amitg2k12

Objective-Cも使用する必要があるC++コードを含む.cppファイルがある場合は、その.cppファイルの名前を.mmに変更するか、-x objective-c++をコンパイラーに渡します。

47
user557219

C++ヘッダーファイルでObjective-cを使用することは不可能であることがわかりました。

ただし、実装ファイルにObjective-cを含めることができます。

(.mmまたは、ファイルの情報で.cppファイルの解釈方法を設定できます。[情報]-> [一般:ファイルタイプ:ソースコード.cpp.objcpp]を選択します)

使用する

cppClass.h:

class objcClass;

objcClass* mMemberVariable;

cppClass.mm:

#import "objcClass.h";

void cppFunction(){
    [objcClass message];
}

cppヘッダーファイル内。

次に、クラスを定義するヘッダーを.cppまたは.mmファイルに含めます。

Qtを使用する場合、Objective-Cクラスを前方宣言するために使用できるQ_FORWARD_DECLARE_OBJC_CLASSマクロがあります。

参考までに、実装は次のとおりです。

#ifndef Q_FORWARD_DECLARE_OBJC_CLASS
#  ifdef __OBJC__
#    define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname
#  else
#    define Q_FORWARD_DECLARE_OBJC_CLASS(classname) typedef struct objc_object classname
#  endif
#endif
1
user362515

XCode 11では、ビルド設定Compile Source as(GCC_INPUT_FILETYPE)をObjective-C++(sourcecode.cpp.objcpp)に変更することで実行できます。これにより、ファイル拡張子の種類をmmに変更する必要がなくなります。

0
Khushneet

プログラミング言語に応じて、ファイルを展開するという名前の手法を使用しました。また、コンパイラに「-x Objective-c ++」を追加しましたが、問題は残りました。 link の評議会に助けられました、「ファイルタイプ」パラメータに注意してください。

0
alexmorhun