constとdefineは何が違うのですか


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

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




`#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の場合、それぞれ独立した定数となってしまい、コンパイル時に結合することはできません。何らか別の方法で実行時に結合することになります。）

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

