理論を一度読んだら、あなた(そして私!)はしばしばその意味を忘れてしまうので、あなたはその意味と理解できるものstatic
との間で混乱していると思います。const
1)まず、const
。const
つまり、この「参照」によって変数の値を変更することはありません。これは、関数の引数、特にポインターを使用する場合に非常に役立ちます。そのため、意図しない値を編集する必要はありません。たとえば、任意に:
void add(int* result, const int* a, const int* b)
この宣言は、誤って入力した場合a = result + b;
、コンパイラが文句を言ってコンパイルを拒否する必要があることを意味します。この場合、誤って上書きしないように変数に名前を付けましたが、より複雑なシナリオでは、変数が発生する可能性があります。
ただし、pmgが言うように、これは値が変更されないことを意味するものではありません。それは単に、そのアドレス/値のこのバージョンについて話すとき、それを変更しないことを意味します。ここでの私のポイントは、誤って変更しようとした場合に備えて、変更するつもりのない引数を保護することが役立つということです。真に固定された値が必要な場合は、プリプロセッサがよく使用され#define TRUE 1
ます。
2)今static
。静的とは、「このコンパイルユニットの外部には表示されない」ことを意味します。これは、クラスのプライベートの概念に似ていますが、同等ではありませんが、この場合は、Cファイル全体について話します。したがって、ファイル内helloworld.c
にあり、上部にある場合は、次のように記述します。
static int x = 10;
x
その後、そのバージョンのinを使用することはできませんhelloworld2.c
。
3)私たちがそれに取り組んでいる間、私たちは別の言葉をしたほうがよいでしょうinline
。inline
私の意見では、マクロを実行するためのより良い方法の一種であり、「コンパイラー、関数呼び出しのコストをかけるのではなく、呼び出した場所にこの結果のコードを実際に配置する必要があります」という意味です。コンパイラの最適化はとにかくこれを行う可能性がありますが、これは可能な場合はインライン化するための明示的な命令として機能します。
要約すると、これらの機能はすべて言語の制御部分であり、実行可能ファイルのさまざまなセグメントのどこに変数が配置されるかではありません。pmgが言うように、コンパイラは好きなことを何でもできます。
コンパイラが何をしたかを知りたい場合は、を使用してgcc -S
ください。gcc
これにより、AT&T形式のアセンブリ言語出力が得られます。最適化がどのように機能するかを理解するために、さまざまなgcc -Ox
whereフラグでこれを試してください。x=0,1,2,3
最後に、実際a.out
には単なる名前であることに注意してください。最新のカーネルは、おそらくa.out
バイナリをサポートせずにコンパイルされています。
それがあなたが本当に尋ねようとしていた質問だと思います。