C++でコンパイルすると、次のような「正式なパラメータ」を扱うエラーメッセージが表示されることがよくあります。
error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned
エラーと、b
が定義している関数のパラメーターであることを理解しています。
しかし、パラメーターがformalであることはどういう意味ですか? 非公式パラメーターもありますか?
「フォーマルパラメーター」という用語は他の言語にも表示されることに気づきました。したがって、Cファミリーの言語に必ずしも固有ではない、より一般的な用語だと思いますか?非公式のパラメーターは、一部の言語のサブセットでサポートされていますか?
答えを見て、最後の質問が1つあります。これらの名前仮パラメーターおよび実際のパラメーター Origin from?それはC標準に由来するものですか、それとも一部の抽象言語計算でそのように呼び出すことの効果ですか?
formalおよびactualパラメーターがあります。
void foo(int arg); //arg is a formal parameter
int main()
{
int val = 1;
foo(val); //val is an actual parameter
}
C++ Standard から:
1.3.1仮パラメータ(パラメータ)
関数の宣言または定義の一部として、または例外ハンドラーのcatch句で宣言された、関数またはハンドラーへの入り口で値を取得するオブジェクトまたは参照。関数のようなマクロ定義のマクロ名の直後にある括弧で囲まれたコンマ区切りリストの識別子。またはテンプレートパラメータ。パラメーターは、仮引数または仮パラメーターとも呼ばれます。
1.3.10実パラメータ(引数)
関数呼び出し式の括弧で囲まれたコンマ区切りリストの式、関数のようなマクロ呼び出しの括弧で囲まれたコンマ区切りリストの前処理トークンのシーケンス、throwのオペランド、または式テンプレートのインスタンス化で山括弧で囲まれたコンマ区切りリストのtype-idまたはtemplate-name。実引数または実パラメーターとも呼ばれます。
仮パラメータは、関数定義で既知のパラメータです。実際のパラメーターは、実際(したがって名前)を呼び出したときに関数に渡すものです。
void foo( int a ); // a is a formal parameter
foo(10); // 10 is the actual parameter
用語について少し教訓的であるという問題ですが、非常に便利です。正式なパラメーターは、関数パラメーターについて考えているだけです。
int foo(bool a, float b);
ここで、a
とb
は正式なパラメーターです。重要なのは、関数本体では、実際に値を知らなくても、それらのパラメーターを「正式に」参照しているということです。実際の関数呼び出し式を評価するの場合にのみ、正式な関数パラメーターはbound関数呼び出し引数になります:
int result = foo(false, 1.5);
この呼び出し式では、最初の引数の値false
が仮パラメーターa
にバインドされ、2番目の引数についても同様です。
パラメータと引数の区別は、言語設計者とコイラー作成者にとってより重要かもしれませんが、C++の例として、テンプレート引数の推論の規則に従おうとするとき、これを回避することは非常に役立ちます。