0

.mファイル内で関数を宣言する方法を知っていると思いましたが、ここでリンカーエラーが発生します。これを.hファイルで宣言します。

#import <Foundation/Foundation.h>
// Other rimports

void SQLite3HelperHandle(NSError* error);

@interface SQLite3Helper : NSObject

// Method signatures

@end

次に、.mファイルで:

#import "SQLite3Helper.h"

void SQLite3HelperHandle(NSError* error)
{
    // Method body
}

@implementation SQLite3Helper

// Methods implementation

@end

しかし、リンカエラーが発生します。エラーには多くの読み取り不可能な情報が含まれています。関連するのは次のとおりです。

「_SQLite3HelperHandleError」、参照元:

また、インラインで宣言するにはどうすればよいですか?ヘッダーで次のように宣言してみました。

extern inline void SQLite3HelperHandle(NSError* error);

そして通常は.mファイルにあります:

void SQLite3HelperHandle(NSError* error);

他の方法も試しましたが、そのリンカーエラーをサイレントにする方法は見つかりませんでした。
マクロと同じくらい速いはずですが、関数を書くには長すぎるので、型チェックを好むので、インライン関数が必要です。

4

3 に答える 3

2

C++スタイルの関数名マングリングのように見えます。

これを解決するには、Cスタイルの関数宣言(.hファイル内)を次の条件の間に置きます。

#ifdef __cplusplus
extern "C" {
#endif

void SQLite3HelperHandle(NSError* error);

#ifdef __cplusplus
}
#endif

これが何をしているのかについての詳細は、この関連する質問 またはこれで見ることができます。

于 2012-12-15T21:44:23.330 に答える
1

構築しているターゲットに.mファイルを含める必要があるようです。

FOUNDATION_EXPORT void ...は.hで使用し、.mファイルにあるものだけを使用します。

于 2012-12-15T21:44:55.357 に答える
0

関数をインラインにするにstatic inlineは、ヘッダーにあるかどうかに関係なく、関数をとして定義します。1つのファイルでのみ必要な場合は、その.mファイルで定義し、ヘッダーから除外します。それ以外の場合は、完全に.hファイルで定義します。

于 2012-12-15T23:09:02.717 に答える