1. ホーム
  2. c++

[解決済み] C++のヘッダーで定数変数を定義する

2023-03-18 02:57:28

質問

私が取り組んでいるプログラムには、すべてのクラスに適用される多くの定数があります。私は1つのヘッダーファイル"Constants.h"を作り、すべての関連する定数を宣言できるようにしたいです。そうすれば、他のクラスで、私は単に #include "Constants.h .

を使ってうまく動作するようになりました。 #ifndef ... #define ... という構文があります。しかし、私はどちらかというと const int... 形式の定数を使いたいのです。でも、どうすればいいのかよくわかりません。

どのように解決するのですか?

単純に、一連の const ints をヘッダーファイルで定義するだけです。

// Constants.h
#if !defined(MYLIB_CONSTANTS_H)
#define MYLIB_CONSTANTS_H 1

const int a = 100;
const int b = 0x7f;

#endif

C++では、名前空間スコープ(グローバル名前空間を含む)で明示的にconstと宣言され、明示的にexternと宣言されていない名前は内部リンクを持っているので、この変数は翻訳ユニットをリンクしたときにシンボルの重複を引き起こさないので、これは有効です。別の方法として、定数を static と明示的に宣言することもできます。

static const int a = 100;
static const int b = 0x7f;

これはCとの互換性が高く、C++のリンクルールに馴染みのない人々にとってより読みやすいものです。

すべての定数がint型である場合、別の方法として識別子をenumとして宣言することができます。

enum mylib_constants {
    a = 100;
    b = 0x7f;
};

これらの方法はすべてヘッダのみを使用し、宣言された名前をコンパイル時の定数として使用できるようにします。使用方法 extern const int を使用し、別の実装ファイルを使用することで、名前がコンパイル時の定数として使用されるのを防ぐことができます。


なお、特定の定数を暗黙のうちに内部リンクにするルールは が行います。 は、他の型の定数と全く同じようにポインタにも適用されます。しかし、やっかいなのは、ポインタを const としてマークするには、他の型の変数を const にするときとは少し異なる構文が必要になることです。あなたはそうする必要があります。

int * const ptr;

で定数ポインタを作成し、ルールが適用されるようにします。

また、これは私が一貫して const を付けることを好む理由の一つです。 int const の代わりに const int . また * を変数の横に置いています。 int *ptr; ではなく int* ptr; (に変更しました(比較対象は この の議論も参照してください)。

C++が実際にどのように動作するかの一般的なケースを反映しているので、私はこういった種類のことをするのが好きです。代替案( const int , int* p など)は、単純なものを読みやすくするために特殊なケースに入れられただけです。問題は、これらの単純なケースから一歩外に出ると、特殊なケースに入れられた選択肢が積極的に誤解を招くようになることです。

ですから、先の例では、一般的な使用法である const のような書き方をお勧めします。

int const a = 100;
int const b = 0x7f;

static int const a = 100;
static int const b = 0x7f;