cが

2012-03-13 3 views
0

は私が誰かは二つの引数なしでそれを呼び出している場合は、時間のエラーをコンパイルしたいcが

AddSprintf(char* , ...) 

としての機能を持っている必要がありました。 現在誰かが電話している場合

AddSprintf("hello") 

これは機能します。しかし、私はこのような呼び出しを無効にしたい。 g ++を使用する方法はありますか?引数を強制的に渡すことはできますか?

+0

2番目の引数を追加することはオプションではありませんか? –

+0

@BoPersson no。 va_listに少なくとも1人のメンバーがいることを確認したい –

答えて

7

過負荷AddSprintf:

void AddSprintf(const char* , ...) {} 
void AddSprintf(const char*); 

次に、あなたはAddSprintf("hello")

をコンパイルするときに奇妙なエラーメッセージが表示されます。しかし、彼らはタイプセーフであるため、C++ 11であなたは可変引数テンプレートを使用する必要があることに注意してください。

0

AddSprintf(char* , char*, ...) 

については何?

0

本当にできません。ドットは「0個以上の引数」を表し、引数があるかどうかを知る方法はありません。多分アセンブラを使用して、スタックポインタのいくつかのチェックを行います。

0

0A0Dによれば、それは可変的です - 定義上、コンパイラはそれでうまくいくでしょう。コンパイル時に失敗したい場合は、単体テストの場合など、1つの引数呼び出しで関数が失敗するようなコードを作成して、新しいプログラマができないことを知るような仕掛けをする必要がありますそれ。

これはどうしてあなたはこれをやろうとしていますか?あなたの問題に対するよりよい解決策があるかもしれません。 AddSprintfは、前処理段階でのテキスト置換として最初の仕事と同じように、

#define AddSprintf(X,...) AddSprintf(X,__VA_ARGS__) 

しかし、この解決策には充分に注意してください:あなたは同じ名前に固執する場合

0

は、その後、あなたは可変長マクロを使用することができます。そして、それだけが関数になります。