[解決済み] C++のヘッダーで定数変数を定義する
質問
私が取り組んでいるプログラムには、すべてのクラスに適用される多くの定数があります。私は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;
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Pythonで定数を作成するにはどうすればよいですか?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
-
[解決済み】"static const" vs "#define" vs "enum"
-
[解決済み】静的定数文字列(クラスメンバ)
-
[解決済み】PHP|define() vs. const.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] インライン変数の仕組みは?