スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


このエントリーをはてなブックマークに追加

使用しない仮引数

多くを知るものは少なく語る
Who knows most says least.
仮想関数やテンプレート関数等、同じシンタックスで複数の使われ方をするような関数では、使用しない仮引数というものが登場することがあります。例えば、
class ClassBase {
  virtual func(int hint);
};

class ClassA : pulic ClassBase {
  virtual func(int hint);
};

void
ClassA::func(int hint)
{
  // このClassのfuncでは仮引数hintは不要なので使用しない
  ...
}
仮想関数やテンプレート以外でも、関数仕様として拡張性を持たせるために用意されているものの、現状では使用しない場合等も考えられるでしょう。

さて、このような使用しない仮引数が使用しないだけで、動作上問題はないのですが、コンパイル時に未使用変数(unused variable)として警告目セージが出力されてしまいます。このような警告を出力されたままで放置すると、本来注意するべき警告が埋もれてしまう(見逃されてしまう)可能性もありますので、できれば避けたいところです。
ここでは、このような未使用仮引数の警告を抑制するいくつかの方法を紹介します。

■コンパイラのunused属性を使用する
コンパイラによっては、変数や構造体に属性をしているための方法が用意されています。例えば、gccでは次のような指定が可能です。
void
func(int val __attribute__ ((unused)) )
{
 ...
}
(参考)GCC - 変数属性の指定

unused以外では、構造体のパック(pack)やアライメント(alignment)調整等、セクション配置等が指定できます。
この方法の問題は、指定方法がコンパイラ依存のため、移植性に問題がでる点です。

■仮引数名を省略する
Cでもプロトタイプ宣言中では仮引数名を省略できましたが、C++では関数定義でも省略できます。使用しない仮引数は、変数名を省略することで、その仮引数を使用しないということをコンパイラに伝えることができます。
残念ながらこの方法はCでは使えません。

■voidキャストを使う
この方法が個人的には最もおすすめです。使用しない変数を関数定義中でvoidキャストしてやる方法です。例をあげます。
#define UNUSED_VARIABLE(x) (void)(x)

void
func(int val)
{
 UNUSED_VARIABLE(x);
 ...
}
この方法のメリットは、C,C++共通で使える、移植性の問題もない、といったこともありますが、何よりあとから未使用変数をgrepし易いこと点があります。上記の例では、未使用変数宣言用のマクロを用意して使用していますので、ソースコード中からUNUSED_VARIABLEをgrepすることで、未使用変数を洗い出して見直すことができます。

【関連記事】
warningに気を配る

【関連リンク】
仮引数名の省略 (C++と組み込み環境)
GCC - 変数属性の指定

【参考書籍】
GCC GNU C Compiler―Manual & Reference
Introduction To Gcc (Richard M. Stallman)


このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

人気エントリ
最近の記事
本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


最近のコメント
Links
プロフィール
  • Author:proger
  • 組み込み関係で仕事してます
ブログ内検索
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。