2011-03-17 1 views
0

Cでの可変長引数リストの機能printf() , scanf(), etcは、C++での関数のオーバーロードとどのように違いますか?Cでオーバーロードされているかどうか

そして、どのように呼び出し

printf("Didnt Work %s",s);

が、Sは次のように定義されて

printf(s,"Didnt Work %s");

異なるん:説明してください

const char *s="string"; 

答えて

6

const char *s="string"; 
printf(s,"Didnt Work %s"); 

で "文字列" の最初の引数は、フォーマット文字列として解釈されます。挿入コードがないため、2番目のパラメータは使用されません。結果は "文字列"になります。

大藤

printf("Didnt Work %s",s); 

あり挿入コードがあるので、第二引数は文字列として挿入されます、結果は「文字列を動作しませんでした」です。

オーバーロードの場合と同じように異なる引数タイプが可能ですが、可変引数を使用する場合は常に同じ関数が呼び出されるため、オーバーロードはありません。オーバーロードでは、引数の型によって異なる関数が呼び出されます。

0

オーバーロードを使用すると、コンパイラがチェックするパラメータの特定の順序付けを行うことができます。 C++では、型が少なくとも1つの関数定義と一致しない場合、コンパイラは不平を言います。一方、可変長引数を持つCは、コンパイル時にこの型チェックを行いません。コンパイラは、パラメータをチェックして、それらが並んでいることを確認しません。すべてのコンパイラではないにしても、ほとんどすべてのコンパイラでprintf("1",3);をコンパイルできます。 Printfは最初の引数を文字列として読み込み、文字列の終わりを示す空のバイトに達するまで読み込みを続けます。これは、可変長引数リストが推奨されない理由です。

+1

'printf(1,3);'はどのコンパイラでもコンパイルされません。 'printf'の最初の引数は型付きです。すなわち、' const char * 'が必要です。しかし、あなたの議論は、可変長引数が型安全ではないという原則に基づいて正しいです。 –

+0

あなたは完全に正しいです。私はそれを修正すべきです... – datdo

0

あなたの2番目の質問に答えるために、他の質問にはすでに最初の質問があります。

Cでの可変引数リストは、C++でのオーバーロードと大きく異なります。 Cでは1つの関数printfがありますが、異なる型の引数では多分異なることがあります。 C++では、オーバーロードを使用して、引数の型に応じて異なる関数の中から選択します。

関連する問題