C++における「宣言」と「定義」の違いとは?具体例でわかりやすく解説
C++を学んでいると、「宣言(declaration)」と「定義(definition)」という2つの用語が頻繁に登場します。この2つはよく混同されがちですが、実際には明確な違いがあります。本記事では、その違いを具体例とともにわかりやすく解説します。
宣言(Declaration)とは?
宣言とは、プログラム内で使用する変数、ユーザー定義型、関数について、その型やサイズ(関数の場合は戻り値の型や引数の型・数)をコンパイラに事前に伝えることです。
重要なポイントは、宣言の段階ではメモリ上に領域が確保されないという点です。コンパイラに対して「この名前の変数や関数が後で登場しますよ」と知らせるだけの役割を果たします。
定義(Definition)とは?
一方、定義とは、宣言が行うことすべてに加えて、実際にメモリ上に領域を確保する処理を含みます。次の式で覚えると理解しやすいでしょう。
定義 = 宣言 + メモリ領域の確保
つまり、定義は宣言を内包する概念です。なお、変数や関数の定義はプログラム内で1回しか行えませんが、宣言は何度でも繰り返すことができます(これがヘッダーファイルに宣言を書き、複数のソースファイルからインクルードできる理由です)。
宣言の例
以下は宣言の具体例です。
extern int a; // 変数aを定義せずに宣言
struct _tagExample { int a; int b; }; // 構造体の宣言
int myFunc (int a, int b); // 関数の宣言(プロトタイプ宣言)
extern キーワードを付けた変数宣言は、その変数が別の場所で定義されていることをコンパイラに伝えます。また、関数の宣言は「プロトタイプ宣言」とも呼ばれ、関数の本体(実装)は含みません。
定義の例
以下は定義の具体例です。
int a; // 変数aの定義(メモリ確保)
int b = 0; // 初期化を伴う定義
int myFunc (int a, int b) { return a + b; } // 関数本体を持つ定義
struct _tagExample example; // 構造体変数の定義
これらの例では、それぞれ実体が生成され、メモリ上に領域が確保されます。関数の場合は、処理内容(本体)が記述されている点が宣言との大きな違いです。
まとめ
宣言はコンパイラに型やサイズの情報を伝えるだけでメモリは確保されず、定義はそれに加えて実際のメモリ領域を確保します。この違いを正しく理解しておくと、リンカエラー(多重定義エラー)の原因究明や、ヘッダーファイルの設計にも役立ちます。C++プログラミングの基礎として、ぜひ押さえておきましょう。
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons
-
C#における「宣言」と「定義」の違いとは?初心者向けにわかりやすく解説
C#プログラミングでは、「宣言」と「定義」という2つの概念を正しく理解することが重要です。この記事では、両者の違いを具体的なコード例とともに解説します。 宣言と定義の違い 宣言とは、変数の型と名前をコンパイラに通知することです。この段階では、変数はまだ値を持っていません。 一方、定義とは、宣言された変数に実際の値を割り当てる(初期化する)ことを指します。 この考え方は、変数だけでなく、配列やコレクションなどにも同じように当てはまります。 変数の場合 変数の宣言 int x; このコードでは、整数型(int)の変数 x を宣言しています。この時点では、x にはまだ何の値も代入されていません。 変