16

私の知る限り、gcc では次のように記述できます。

#define DBGPRINT(fmt...) printf(fmt);

VC++でそれを行う方法はありますか?

4

9 に答える 9

24

はい、ただし VC++ 2005 以降のみです。例の構文は次のようになります。

#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)

完全なリファレンスはこちらです。

于 2008-09-15T17:51:32.450 に答える
4

はい、バージョン 2005 以降の Visual Studio C++ でこれを行うことができます (VS 2003 についてはわかりません)。VA_ARGSを見てください。基本的に次のようなことができます。

#define DBGPRINTF(fmt, ...)  printf(fmt, __VA_ARGS__)

マクロへの可変引数は、'...' args として提供される関数に渡され、そこで va_args を使用してそれらを解析できます。

VA_ARGSとマクロを使用すると、奇妙な動作が発生する可能性があります。VA_ARGSは変数であるため、引数が 0 になる可能性があることを意味します。これにより、意図しない場所にコンマが残る可能性があります。

于 2008-09-15T17:48:29.743 に答える
4

非標準の拡張子を使用したくない場合は、追加のブラケットを提供する必要があります:

#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
于 2008-09-15T18:22:31.923 に答える
1

__FILE__マクロの機能( 、、__LINE__トークンの貼り付けなど)が実際に必要ない場合は、を使用して可変個引数関数を作成することを検討してstdargs.hください。を呼び出す代わりに、可変引数リストを渡すためにprintf()可変個引数関数を呼び出すことができます。vprintf()

于 2008-09-16T03:23:51.530 に答える
1

MSVC 7.1 (.NET 2003) の場合、これは機能します。

#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
于 2013-05-03T18:57:17.297 に答える
1

あなたが探しているのは [可変長マクロ]( http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)と呼ばれるものです。

リンクの要約: はい、VC++ 2005 以降。

于 2008-09-15T17:48:53.143 に答える
0

MSDN で「 VA_ARGS」と va_list を検索してください。

于 2008-09-15T17:57:32.107 に答える
0

以下はうまくいくはずです。( Variadic マクロへのリンクを参照)

(以下の例は、固定引数と可変引数を示しています。)

#  define DBGPRINTF(fmt,...) \
    do { \
        printf(fmt, __VA_ARGS__); \
    } while(0)
于 2008-09-15T17:49:45.713 に答える
-2

ほとんど。ただし、それはそれよりも醜いです (そして、おそらくマクロ自体に末尾のセミコロンは必要ありません:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'

使用するには:

DBGPRINT(("%s\n", "Hello World"));

(括弧のペアがありませんでした)。

元の質問に VC++ のバージョンが記載されておらず、すべてのコンパイラで可変長マクロがサポートされていない理由がわかりません。

于 2008-09-15T17:47:04.177 に答える