定数 (プログラミング)
以下のC言語における例では、定数yの初期化に変数を使用しており、仮引数xの値(実引数)によってyの値は実行時に変化する。このyは数学や物理学などにおける定数(数学定数や物理定数など)とは異なり、「再代入できない変数」を表している。
一方、「コンパイル時定数」としての定数の値は常に静的に定まる。C言語およびC++のconst型修飾子 (type modifier) は文脈によって意味が異なり、再代入できない変数を定義する目的のほか、コンパイル時定数を定義する目的にも使われる。
C#のconst修飾子 (modifier) は常にコンパイル時定数の定義に使用される。ただし将来的に変更される可能性のある定数をアセンブリ外部に公開する場合、アセンブリを再コンパイルすることなくバイナリ互換性を維持するには、constの代わりにreadonlyを使用することが推奨されている。
C++11規格以降のC++では、コンパイル時定数の定義に使用可能なconstexpr指定子 (specifier) をサポートするようになった。
伝統的にC言語では、コンパイル時定数はプリプロセッサ(cpp; en:C preprocessor)による置き換え(オブジェクト形式マクロ)で擬似的に実現されていた。C++ではconst修飾によるコンパイル時定数を用いることで、プリプロセッサによるマクロ定数をほとんどの場面で排除することができる。また、C++11以降ではconstexprのサポートにより、マクロ定数の必要性がさらに減っている。一方、C言語では、const修飾された変数がたとえコンパイル時定数であっても、C++よりも定数として利用可能な場面が制限される。C言語ではconst修飾された変数は外部リンケージを持つため、コンパイル時定数であってもヘッダーファイルに定数として直接定義して共有することはできない。一方、C++ではconst修飾された変数は既定で内部リンケージを持つため、ヘッダーファイルに定数として直接定義して共有することができる。固定長配列の要素数など、C言語では依然としてconst修飾によるコンパイル時定数が使えない場面も多く残っている。
なお、C言語では、列挙型enumにより定義された列挙定数の値が、内部的には整数定数であるため、マクロ定数の代わりに使われることがある。