宣言と定義の明確な違いはなんですか


宣言と定義の明確な違いはなんですか。  
例えば以下の例は、両方定義として考えていいのですか

[code]

    #define a 100
    #define b a
    
[/code]




「宣言」「定義」は英語では"declaration"、"definition"です。  
本家stackoverflowにちょうど該当する質問があります。

  * [What is the difference between a definition and a declaration?](https://stackoverflow.com/questions/1410563/)

ここによると、簡単にいえばコンパイラが参照を解決するために必要な構文要素が「宣言」であり、リンカが参照をリンクさせるのに必要な構文要素が「定義」ということのようです。詳しくは本家の質問と回答を見てみてください。質問者さんが例で示したコードは、他の回答にある通り「プリプロセッサディレクティブ」であり、定義や宣言とはまた異なるものです。

定義と宣言の明らかな違いとしては、同じ識別子の「宣言」はコンパイル単位ごとに別々に存在できるのでひとつのプログラム中に複数回登場することがありますが、定義にはOne
Definition Ruleというルールがあり、ひとつの関数は単一の定義だけを持たなくてはならないという点です。

