読者です 読者をやめる 読者になる 読者になる

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を適用するマクロ

http://redmine.lighttpd.net/projects/lighttpd/repository/entry/trunk/src/settings.h=title=lighttpdのsetting.hより

#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) {
}