ヘッダーで既に静的固定長配列を再定義しているにもかかわらず、コンパイラーがコンパイル単位で静的固定長配列を再定義する必要がある理由を説明していただければ幸いです。次に例を示します。
MyClass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
private:
static char myPrecomputeTable[256];
}
#endif
MyClass.cpp
#include "MyClass.h"
char MyClass::myPrecomputeTable[256];
MyClass.cpp の再定義を削除すると、リンカは myPrecomputeTable が未定義であると不平を言います。構文は冗長なようです。コンパイラ/リンカーが定義を必要とする理由を誰かに説明してもらえますか?
編集:
申し訳ありませんが、私が混乱していたことについて明確ではなかったと思います。宣言/定義の概念を理解しています。興味深いのは、配列のサイズを定義することです。定義と宣言の両方で、冗長に見えるサイズを定義する必要があります。
編集:
もう少し掘り下げてみたところ、このトピックへの多くのアプローチがコンパイラに適していることがわかりました。コンパイル:
MyClass.h
class MyClass {
static char myPrecomputeTable[256];
};
MyClass.cpp
char MyClass::myPrecomputeTable[256];
コンパイル:
MyClass.h
class MyClass {
static char myPrecomputeTable[];
};
MyClass.cpp
char MyClass::myPrecomputeTable[256];
コンパイル:
MyClass.h
class MyClass {
static char myPrecomputeTable[256];
};
MyClass.cpp
char MyClass::myPrecomputeTable[];
コンパイルしない:
MyClass.h
class MyClass {
static char myPrecomputeTable[512];
};
MyClass.cpp
char MyClass::myPrecomputeTable[256];
サイズは、ヘッダーまたはクラス、あるいはその両方で定義する必要がありますが、コンパイラは競合するサイズを停止するのに十分スマートです。