C言語における宣言と定義の違い


1、宣言と定義の違い

  • 変数の宣言と定義を指す場合:コンパイルの原理から言えば、宣言はコンパイラにタイプの変数が使用されることを伝えるだけですが、コンパイラはメモリを割り当てません.定義はメモリが割り当てられていることです.次のコード
  • を見てみましょう
    void Func()
    {
         
    int a;
    int b=1;
    a=0;
    }
    
  • 最初の行のコードについて、コンパイラは何もしません.スタックに3番目の文まで何も割り当てません.a=0です.を選択すると、コンパイラはスタックに押し込まれます.一方、int b=0については、この文では、コンパイラは命令を生成し、値を割り当てます.逆アセンブリの場合、表示されるコードは、
  • である可能性があります.
    push 1;
    push 0;
    
  • もちろん、必ずしもコンパイラがそうするとは限らないし、int aを宣言するときに、コンパイラが廃値をスタックに入れ、第3条になってから値を割り当てる可能性もある.これはコンパイラの具体的な取捨選択にかかっているので、宣言は必ずしも定義ではなく、定義は定義である.ただし、externを使用する宣言は、
  • のみであるに違いない.
    extern int a;
    
  • この表には、int変数aがあります.それは他の場所で定義されているに違いありません.したがって、コンパイラはメモリを割り当てることはありません.それは宣言であり、次のコードが1つの記号を参照していることを示しているだけで、この記号はintタイプのaです.関数の宣言と定義を指す場合:
  • 宣言:一般的にヘッダファイルでは、コンパイラに「function()という関数があります.コンパイラにこの関数の存在を知らせます」と言います.定義:一般的にソースファイルでは、具体的には関数の実装過程に関数体が明記されています.