Cのプログラムでたまに出てくる関数内の無意味なvoid宣言の意味
C言語のソースを読んでいると、稀に以下のような感じのフレーズが出てきます。
void doSomething(int unused) { (void)unused; }
この(void)unused;
は一体なんじゃい、という話なのですが、一言で言えば「コンパイル時のunused variable系warningを減らすためのダミーステートメント」だそうです。gccで言えば、"-W"と"-Wunused"または"-Wall"オプションの併用で、警告が出るのですが、それが抑制されるというわけです(参考)。ちなみに、C++では使わない方が良いようです。
減らす方法は、上記以外にも色々あるようなので、見つけたものを紹介します。
上のコードを単純にマクロにしたもの
#define UNUSED_PARAM(x) ((void)(x)) void doSomething(int unused) { UNUSED_PARAM(unused); }
GCCのattributeを適用するマクロ
#ifdef UNUSED_PARAM #elif defined(__GNUC__) # define UNUSED_PARAM(x) UNUSED_ ## x __attribute__((unused)) #elif defined(__LCLINT__) # define UNUSED_PARAM(x) /*@unused@*/ x #else # define UNUSED_PARAM(x) x #endif void doSomething(int UNUSED_PARAM(unused)) { }
後置タイプ
#ifndef UNUSED_PARAM # if defined(__GNUC__) # define UNUSED_PARAM __attribute__((__unused__)) # else # define UNUSED_PARAM # endif #endif void doSomething(int unused UNUSED_PARAM) { }
参考
- what does this macro do? #define UNUSED(x) ( (void)(x) )
- この問題について私が最初に見つけたサイト
- 使わない仮引数 - odz buffer
- /trunk/src/settings.h - Lighttpd - lighty labs
- lighttpdの一部
- http://opensource.apple.com/source/JavaScriptCore/JavaScriptCore-521/wtf/UnusedParam.h
- Webkitのコードの一部(?)
- c++ - The UNUSED macro - Stack Overflow
- clmemo@aka: gcc の警告オプション -Wall と -W
- gccの警告について