web-dev-qa-db-ja.com

CおよびC ++の関数シグネチャで使用されるポータブルUNUSEDパラメーターマクロ

未使用の変数の警告を排除するマクロを作成することに興味があります。

この質問では、関数コード内にマクロを記述することにより、未使用のパラメーター警告を抑制する方法について説明します。

C/C++でUNUSEDマクロを実装する、コンパイラーに依存しない普遍的な方法

しかし、関数のシグネチャで使用できるマクロに興味があります。

void callback(int UNUSED(some_useless_stuff)) {}

これは、Googleを使用して掘り出したものです( source

#ifdef UNUSED
#Elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#Elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#Elif defined(__cplusplus)
# define UNUSED(x)
#else
# define UNUSED(x) x
#endif

これを他のコンパイラーにさらに拡張できますか?

編集:タグ付けの仕組みを理解できない人のために:CとC++の両方のソリューションが必要です。そのため、この質問にはCとC++の両方のタグが付いており、C++のみのソリューションは受け入れられません。

34
Let_Me_Be

テストしてコメントを確認した後、質問で言及された元のバージョンで十分であることが判明しました。

使用:#define UNUSED(x) __pragma(warning(suppress:4100)) x(コメントで言及)は、MSVCでCをコンパイルするために必要かもしれませんが、それは非常に奇妙な組み合わせなので、最後には含めませんでした。

9
Let_Me_Be

私がそれを行う方法は次のようなものです:

#define UNUSED(x) (void)(x)
void foo(const int i) {
    UNUSED(i);
}

Visual Studio、Intel、gccおよびclangで問題が発生したことはありません。

もう1つのオプションは、パラメーターをコメントアウトすることです。

void foo(const int /*i*/) {
  // When we need to use `i` we can just uncomment it.
}
22
Matt Clarkson

未使用がマクロとして定義されている可能性があるため、__attribute__((__unused__))__attribute__((unused))として使用する方が良いことは1つだけです。

しかし、私が使用しているトリックは次のとおりです。

#define UNUSED(x) (void)x;

ただし、変数とメソッドの引数に対してのみ機能し、関数自体に対しては機能しません。

7
doc_ds

多くのコンパイラーで、lintのサポートを除き、以下を使用しました。

#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
#       define PGM_GNUC_UNUSED         __attribute__((__unused__))
#else
#       define PGM_GNUC_UNUSED
#endif

テスト済みのコンパイラ:GCC、Clang、EKOPath、Intel Cコンパイラ/ Composer XE、Cygwin/Linux/MSYS上のMinGW32、Cygwin/Linux上のMinGW-w64、Sun ONE Studio/Oracle Solaris Studio、Visual Studio 2008/2010。

使用例:

pgm_tsc_init (
        PGM_GNUC_UNUSED pgm_error_t**   error
        )
{
...
}

PGMは、このCベースのプロジェクトの標準プレフィックスです。 GNUCは、この属性に対するGLibの規則です。

コンパイル時に__attribute__特定の状況ではあるが、間違いなくエラーではない。

6
Steve-o