2

私の MyConstants.h ファイルに...私は持っています:

int abc[3];

一致する MyConstants.m ファイルには...次のものがあります。

extern int abc[3] = {11, 22, 33};

他の *.m ファイルのそれぞれに...

#import "MyConstants.h"

私の viewDidLoad{} メソッドの 1 つの中に、次のものがあります。

extern int abc[];
NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));  

「abc = (22) (3)」ではなく「abc = (0) (3)」と表示されるのはなぜですか?

これを期待どおりに機能させるにはどうすればよいですか?

4

1 に答える 1

5

extern、ソース ファイルの定義ではなく、ヘッダーの宣言にある必要があります。externシンボルが別の場所に存在することをコンパイラに伝えます。同じ翻訳単位にある場合とない場合があります。宣言されたすべてのシンボルが実際に定義されていることを確認するのは、リンカの仕事です。

定数ヘッダー ( MyConstants.h):

extern int abc[3];

定数ソース ( MyConstants.m):

int abc[3] = {11, 22, 33};

その他の情報源 ( SomeFile.m):

#include "MyConstants.h"
...
- (void) someMethod
{
    NSLog (@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));
}

また、配列のサイズを測定する場合、最初の要素のサイズで割るとエラーが発生しにくくなるため、型がabc変化しても (つまり からintdouble)、結果は有効であることに注意してください。

- (void) someMethod
{
    NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(abc[0]));
}
于 2010-05-12T01:36:12.217 に答える