0

次のような可変引数を取る関数があります

int log_data (LOG_TYPE eType, ...)
{
    /** some logging related stuff here **/
}

ヘッダーファイルでは、次のようなものを使用します

#ifdef LOGGING_ENABLED
int log_data (int nType, ...);
#else
#define log_data(_x_, ...)
#endif

基本的に、アイデアはデバッグのオンとオフを切り替えることです~~~

  • 問題: 上記のロジックは Linux と gcc では問題なく動作しますが、Windows VC++ でのコンパイル中にエラーが発生します。
4

2 に答える 2

4

可変個引数マクロは比較的新しいものです。たとえば、このリファレンスには、「可変個引数マクロのサポートは Visual C++ 2005 で導入されました」と記載されています。古いバージョンを使用している可能性があります。

編集log_dataデバッグが必要な場合は宣言していますが、そうでない場合は宣言していません。これは、関数の定義#ifdefも同様に持っていることを意味します。これを行っている限り、解決策は次のようになります。

int log_data (int nType, ...)
{
#ifdef LOGGING_ENABLED
     /* the code to do logging */
#else
     return 0; /* or whatever */
#endif
}

ヘッダー ファイルで、通常どおり関数を宣言します。

int log_data (int nType, ...);

これには、ログを記録していないときでも関数呼び出しが存在するという欠点がありますが、プリプロセッサが可変引数をサポートしなくても機能するという利点があります。

于 2009-12-14T06:38:16.077 に答える
3

古いバージョンの VC++ は、マクロで可変引数をサポートしていません。

このトリックを使用して回避できます。

#ifdef LOGGING_ENABLED
#define log_data log_data_impl
#else
#define log_data
#endif

// usage:
log_data(level, ...)

更新 - 別の可能な回避策:

#ifdef LOGGING_ENABLED
#define log_data(P) log_data_impl P // no braces around P!
#else
#define log_data(P)
#endif

// usage: we have to use two braces
log_data((level, ...));
于 2009-12-14T06:37:18.493 に答える