1

C++11 または C++14 に、使用する必要がなくなる新しい機能はありますか。

TRACE0("one-string-no-args");  

TRACE("formatting string with one-or-more args", arg1, arg2, etc);  

私の知る限りでは、オーバーロードでは追加引数がゼロの場合と 1 つ以上の引数がある場合を区別できないため、このような関数は名前で区別する必要がありました。

もちろん、これはprintfスタイル インターフェイスにとって重要です。引数がもうないことを知ることができるということは、フォーマット文字列をフォーマット文字列として解釈しようとするのではなく、最終的な出力文字列としてのみ解釈しようとすることで、バグのクラスを回避できることを意味します。

4

3 に答える 3

0

For the TRACE macros (which are typically included in Microsoft's debugging macros), no, the language will not have a "new" method for handling preprocessor macros (it is effectively the same as it has been).

For functions in general, variadic functions have always been supported (e.g. printf).

于 2013-10-08T17:11:20.430 に答える
0

これはばかげているように思える人もいるかもしれませんが、私は管理する C スタイルの printf コードを大量に持っています。

ブーストのフォーマット ライブラリを使用してすべてを再構築することができます。ただし、当面は、1 つの引数、または 1 つ + 1 つ以上の引数を区別できるようになるだけでも大きな前進です。

https: /落とし穴)。

以下は、MFC/C++ で機能する簡単な例です。

bool Write(const wchar_t * pszText);
template <typename T> bool Write(const wchar_t * pszFormat, T, ...);

Write は vwsprintf に相当するものを呼び出す必要はありません (また呼び出すべきではありません) が、Write<> は出力文字列を作成してから Write に渡すために呼び出します。

とてもエレガントです。2 番目のインターフェイスのみを提供する (そして、1 つの文字列に偶発的な printf 書式指定子が含まれていると、printf の問題が発生する)、またはクライアントに Write() と WriteFormat() を指定するように強制するか、または同様にWrite() を呼び出す前にローカルで文字列を構築します。

Write に関して定義された Write<> は次のとおりです。

template <typename T> bool SimpleTextFile::Write(const wchar_t * pszFormat, T, ...)
{
    va_list arglist;
    va_start(arglist, pszFormat);
    CStringW buffer;
    buffer.FormatV(pszFormat, arglist);
    va_end(arglist);
    return Write(buffer);
}
于 2014-01-30T14:28:17.313 に答える