デフォルトの引数ンスプロモーションのC関数呼び出し
-
12-09-2019 - |
質問
設定
いくつかについての質問をデフォルトの引数の促進を行う関数を呼び出すときには、C.こちらの部6.5.2.2"通話機能"項6、7、8から C99標準(pdf) (重点を追加的に行われるリストのみ):
第6項
- 場合には、呼び出し機能タイプ を含まない試作品, の整数促進されることを見いだした各引数は、引数とタイプ
float
昇double
.これらの デフォルトの引数モ.- 多数の場合は引数が不均等のパラメータの動作は定義されていません。
- この機能を定義するタイプ を含む試作, のいずれかの試作を終了する省略(
, ...
の種類の引数の後の推進には対応しておりませんの種類のパラメータの動作は定義されていません。- この機能を定義するタイプ を含まない試作品, の種類の引数の後の推進に対応していないその後のパラメータ推進の動作は未定義は、以下の場合:
- 一促進タイプは、符号付き整数型、その他の推進タイプに対応する符号なし整数型の値はrepresentable両タイプ
- どちらのタイプのポインタを格で絶版の文字の種類や
void
.
第7条
- 場合には、呼び出し機能タイプ ななどの試作, の引数が暗黙的に変換され、場合による課題の種類に対応するパラメータのタイプの各パラメータの適正版を宣言されたタイプです。
- の省略表記の機能を試作declarator原因の引数型への転換を停止していた最後の宣言されたパラメータとします。 デフォルトの引数が促進されることを見いだした最後の引数になります。
第8
- 他にはない暗黙的に変換を行います;特に、種類と数の引数でない者と比較すると、パラメータの機能を定義する は含んでいない機能試作declarator.
何か
- の デフォルトの引数モ は
char
やshort
へint
/unsigned int
やfloat
へdouble
- オプションの引数variadic機能
printf
該当する場合は、デフォルトの引数モ
ちなみに、私の理解 機能試作 ここに
void func(int a, char b, float c); // Function prototype
void func(int a, char b, float c) { /* ... */ } // Function definition
質問
私を本当に大変grokingています。Faq(よくある質問してい:
- い試作および非試作機'動かないなどについてデフォルトのプロモーションや暗黙的に変換?
- どのような場合にデフォルトの引数モ起こり得るのでしょうか。いつでも?又はそれだけで特別な場合となっているため、このvariadic機能)?いるかどうかによって機能を試作?
解決
Upvoted AProgrammerの答えは実際の商品です。
人に迷 なぜ というこの方法:の暗黒時代前の1988年のがなければならないと思うかの機能を試作クラシック"K&R"Cデフォルトの引数モったので(a)が本質的には"無料"で、コストも入れるバイトに登録しよう単語を登録、および(b)に削減可能性誤差パラメータを生み出していきます。ただし、そうなかで、物詩、"雪あかりinにしわが"が導入機能プロトタイプANSI Cにおいて最も重要な変更をC言語です。
ちの場合、デフォルトの促進キック: デフォルトの引数種キャンペーンで使う時に予想される型の引数は 不明, と言うことですがありません試作の引数がvariadic.
他のヒント
(Variadic)パラメータの機能を原型に変換タイプ対応可能なchar、short、float.
パラメータ機能な試作variadicパラメータはデフォルトの引数セールスプロモーション
設定されていない場合は、機能プロトタイプ開発と利用しないでの試作やバイスそのものパラメータは、char型の短浮かして実行します。だが、このような問題variadic機能の場合の推進タイプが一致しないと何を読み込む際に利用する引数リスト。
例1:問題を定義するときには、機能プロトタイプ開発と利用します。
定義で設定します。c
void f(char c)
{
printf("%c", c);
}
利用します。c
void f();
int main()
{
f('x');
}
失敗するのでintは渡される機能が期待文字に置き換わります。
例2:問題を定義するときには機能せずに試作品を使用します。
定義で設定します。c
void f(c)
char c;
{
printf("%c", c);
}
このような定義は非常に古)
利用します。c
void f(char c);
int main()
{
f('x');
}
失敗するのでintはもcharますが渡されなくてはなりません。
注意:ご挨拶する全ての機能を標準ライブラリからしているタイプの結果からデフォルトのセールスプロモーションうな問題の中での移行時のプロトタイプが追加されます。
あなたの混乱は、用語の非常にわずかな誤解から生じて - 宣言と定義の両方がプロトタイプ(またはしない)を含めることができます:
void func(int a, char b, float c);
つまりプロトタイプを含む関数宣言
void func(int a, char b, float c) { /* ... */ }
これはプロトタイプを含む関数の定義のです。
「プロトタイプ化」とは、「非プロトタイプ化」だけで機能の属性はのの入力し、両方の宣言と定義は、関数の種類を紹介します。
あなたがプロトタイプなしで宣言を持つことができますので、ます:
void func();
か、プロトタイプ(K&R Cスタイル)せずに定義を持つことができます:
void func(a, b, c)
int a;
char b;
float c;
{ /* ... */ }