

この2つはどのように使い分けますか  
どちらかに統一したほうがいいですか

入門時に読み飛ばしたのかもしれません全く覚えてないのです


CC BY-SA 3.0
2015-08-05T06:25:21.127
13061
2015-08-05T09:10:58.353
2015-08-05T06:43:20.567
4236
10809
question
c++ preprocessor
constとdefineは何が違うのですか


`const`は変数を宣言する際に使用します。  
入れ物があり、中身が固定されている状態です。

`define`は文字列を指定の値で全て置き換えます。

違いと言えばコンパイル前に置き換えるかどうかですかね

**追記：**  
使い分けの所を見落としてました。  
特に大きく気にするところではありませんが、  
`const`の方がC言語っぽい感じがします。  
(ポインタを使い始めると`const`よく使うかも、メモリアドレスの参照先を変更したくない時とか)  
ですが、`switch`文の`case`などで定数を使いたい時は`define`を使わなければなりません。  
時と場合によりますが、 **`define`がコンパイル前に置き換える**と言った点を考えれば使い方が見えてくる気がします。  
自分は基本C言語系では`const`です。


CC BY-SA 3.0
2015-08-05T06:39:41.470
13062
2015-08-05T06:50:23.297
2015-08-05T06:50:23.297
7676
7676
13061
answer


`#define`はプリプロセッサによって展開処理されます。（[宣言と定義の明確な違いはなんですか](https://ja.stackoverflow.com/q/12941/4236)、[includeと宣言の違いはなんですか](https://ja.stackoverflow.com/q/13009/4236)）

そのためコンパイラーには展開結果だけが渡されてしまい元の情報が残りません。例えばデバッグ時に参照できない場合があります。

逆にコンパイル前に展開処理される点を利用して、

[code]

    #define HELLO "Hello"
    #define WORLD "World"
    char message[] = HELLO ", " WORLD ".";  // "Hello, World."に展開・結合される
    
[/code]

のように文字列を展開してしまい、コンパイル時に１つの文字列を結合させることができます。（constの場合、それぞれ独立した定数となってしまい、コンパイル時に結合することはできません。何らか別の方法で実行時に結合することになります。）

それぞれに利点と欠点がありますので、適材適所で使い分けてください。


CC BY-SA 3.0
2015-08-05T06:58:34.170
13064
2015-08-05T06:58:34.170
2017-04-13T12:52:39.113
-1
4236
13061
answer


`#define`はコンパイルの初期段階でコピペや置換されると考えてください  
そのため、定義後はグローバル変数のようにずっと存在し続けます。  
`const`はあくまでも変数として存在していますので記憶領域の概念が適応でき保守性が確保できます。  
もし、既に`#define`で定数が定義されていた場合可読性のために同じ名前でないといけないと思えば`#undef`を利用しなければなりません.またそのようなコードになってしまうと変更の際に間違えて変更する可能性もあります。そのような事態は避けなければならない。このような観点から`const`で領域に制限を設けたほうが自由度の高いコードが記述できるようになると思います。


CC BY-SA 3.0
2015-08-05T09:10:58.353
13067
2015-08-05T09:10:58.353
10455
13061
answer