2017-03-20 7 views
1

私はC++コンポーネントを持つiOSアプリケーションを作成しています。C++(CFBundleGetMainBundle)でバンドルされたファイルへのパスを取得する

CFBundleRef mainBundle = CFBundleGetMainBundle(); 

これは素晴らしいですが、それは私が私のファイルの先頭に

#include <UIKit/UIKit.h> 

のようなものを含める必要がありそうです:メインバンドルを取得するためには、他の多くの答えがこれを使用することをお勧めします。しかし、これを実行すると、次のようなエラーが発生します。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:494:9: Unknown type name 'NSString' 

これは私のC++コードと関係があると想定しています。私はこのエラーを投げない何かが私が含めることができるかどうか疑問に思っていますか?そうでない場合は、C++コード内のファイルへのパスにアクセスする正しい方法は何ですか?

+1

'#include 'で十分です。 –

答えて

1

あなただけCoreFoundation

#include <CoreFoundation/CoreFoundation.h> 

それとも含めて試すことができるだけでもCFBundle

#include <CoreFoundation/CFBundle.h> 
+0

ありがとう! '#include 'は私のために働いた – Abs

0

点がある - あなたが#includeしようとしているとき - それはコードがネイティブCまたはC++であると考えています。その場合は、プリプロセッサーに#ifndef ...で1回だけ含めるように指示する必要があります。

あなたはC++とObjective Cコードを混在することを計画している場合 - #importの代わり#includeを使用して、.m.mmへの拡張からこのクラスを使用して、すべてのファイルの名前を変更する必要があります。

最後に私は確信して、そのNSStringNSFoundationまたはCoreFoundationの一部です - UIKitNSObjectの対象ではありません。

0

これは、Cの「コンパイル単位」のコンセプトによるものです。基本的に、ソースファイルに含めるすべてのヘッダーは、そのファイルの言語で記述する必要があります。 Objective CとC++の両方がCの(大まかに)スーパーセットなので、C++ヘッダとObjective-Cソースファイルの両方にCヘッダ(CoreFoundationなど)を含めることができます。

しかし、C++コンパイラはObjective-Cファイルの読み方を知らず、Objective-CコンパイラはC++ファイルの読み方を知らないため、Objective-CヘッダーをC++コンパイラは多くのエラーメッセージを表示します。

この問題を回避するには、CFBundleのドキュメントを参照する必要があります。 CFBundleはCoreFoundationの一部であり、C APIであり、C++ファイルから簡単に呼び出すことができるので、正しいヘッダーを含める必要があります。

UIKitを含めると、UIKitの一部がCoreFoundationに基づいており、CoreFoundationも含まれているという副作用に過ぎません。

ただし、すべてのAPIがCバージョンとして利用できるわけではありません。 UIKitやAVFoundationなどから何かを呼び出す場合は、やりたいことをするCの "ラッパー関数"を作成しなければならず、内部的にObjective Cに実装されているかもしれません。.m実装ファイルにのみObjective-Cが含まれていて、ヘッダーファイルがintやboolのような関数と標準Cデータ型を公開している限り、C++アプリケーションから関数を呼び出すことができます他のプレーンC関数(普通のCと同じようにextern "C"の使用が必要になるでしょう)。

"Objective-C++"(ファイルサフィックス.mm)もあります。これはObjective-CとC++を実装ファイルに混在させる "擬似言語"ですが、単純なC++ファイルからObjective-Cを呼び出せるように、ヘッダーにObjective-Cを公開しないように注意してください。

関連する問題