現在C++とDXライブラリを用いてゲーム開発を行っています。
その際の定数定義には、defineマクロとconstのどちらを用いるのが適切ですか?
それぞれの違いと特長・利点も含めて教えて頂きたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
C++でコンパイル時に定数として決まるのならばconstexpr
をオススメします。
#define
は単なる文字列置換マクロです。
C言語の場合、const修飾された変数
は定数式ではないという制約があったため
- 配列の要素数を指定する際に使えない
- const変数の初期化式に使えない
などの制約がありました。
このため、C言語との互換が必要ならば#define
を使う必要がありました。
const
は定数として扱える変数です。
C++では配列の要素数の指定などにも使えるようになりました。
コンパイル時に定数となるもの、実行時に定数として取得するものがあります。
そのため変数と同様に、メモリアクセスが発生しえます。
constexpr
はコンパイル時に決定される定数です。
コンパイル時に値が分かっているので、機械語に埋め込まれる事を期待できたはずです。
さらにconstexpr関数を用いる事でC言語の関数マクロの大半を投げ捨てる事が可能になります。
投稿2018/05/17 12:03
編集2018/05/17 13:39総合スコア15147
0
マクロはコンパイル処理の前段階で単純なテキスト置換によって展開されるため、C/C++の文法の外にあります。いわば無法地帯です。うっかりミスもコンパイラーは察してくれません。下手をすると一見正しそうに見えるコードが大量のエラーを吐き出す羽目にもなりかねません。
また、前述の通り、マクロはC/C++の文法の外にあるのでスコープが無視されます。これは非常にやっかいです。あのマイクロソフトがWindows APIでマクロ定義しまくりやがっているおかげで痛い目に遭ったプログラマーは数多いでしょう。
というわけで、どうしてもマクロでなければ困るという状況でない限り、const
あるいはconstexpr
を使用してください。
投稿2018/05/17 16:07
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
constは、型情報を持ちます。
defineは、型情報を持ちません。
普通は、constかと思いますが、defineも状況次第では役に立ちます。
定義に型を含まない、、、正確には、単なる置き換えなので、分かって使う分には色々と重宝しますが、それがバグの温床という指摘で、使うべきでないという話。
投稿2018/05/17 11:48
総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/18 01:49