9

C++ コードの大部分を Visual Studio (2008) から Xcode (4.4+) に移植すると、次のような行に遭遇します。

UNUSED_ALWAYS(someVar);

UNUSED_ALWAYS(x)(を介してUNUSED(x)) マクロが展開され、xVisual C++ が正常に停止しているように見えます。ただし、Clang には十分ではありません。

Clang では、通常#pragma unused xディレクティブを使用します。

UNUSED_ALWAYSおよびマクロは、Xcode が Windows のものをコンパイルするのに役立つ多くのユーティリティを含む、私が制御UNUSEDする人工的なヘッダーで定義されています。windows.h

UNUSED(x)に展開するように定義する方法はあり#pragma unused xますか? 私はこれを試しましたが、Clangは受け入れられません:

#define UNUSED(x) #pragma unused(x)

私も試しました:

#define UNUSED(x) (void)(x)

これはうまくいくようです。何か見逃しましたか?

4

3 に答える 3

11
(void)x;

結構です; 常に私のために働いてきました。通常、マクロを #pragma に展開することはできませんが、通常、マクロから生成できるわずかに異なるプラグマ構文があります (gcc および clang では _Pragma、VisualC++ では __pragma)。

それでも、実際には C++ では (void)x はもう必要ありません。関数パラメーターに名前を付けて、それを使用しないことを示すことはできないからです。

int Example(int, int b, int)
{
   ... /* only uses b */
}

完全に正常に動作します。

于 2012-08-30T14:23:43.803 に答える
5

うん - GCC と Clang にこのアプローチを使用できます。

#define MON_Internal_UnusedStringify(macro_arg_string_literal) #macro_arg_string_literal

#define MONUnusedParameter(macro_arg_parameter) _Pragma(MON_Internal_UnusedStringify(unused(macro_arg_parameter)))

私の場合は(void)clang用に定義されたアプローチがありましたが、Clangは現在、上記のstringifyと_Pragmaアプローチをサポートしているようです。_PragmaC99です。

于 2012-08-30T14:28:18.683 に答える
1

#define#pragmaどちらもプリプロセッサ ディレクティブです。プリプロセッサ ディレクティブとして展開するマクロを 1 つ定義することはできません。以下は正しくありません。

#define MY_MACRO   #if _WIN32 

MY_MACRO はコンパイラ#if _WIN32用に展開できません。

最善の策は、独自のマクロを定義することです。

#define UNUSED(_var) _var
于 2012-08-30T14:13:18.977 に答える