【C言語】
unused parameter
~未使用引数警告の消し方~

warning: unused parameter ‘argc’

警告:未使用引数
[-Wunused-parameter]

■この記事の概要

この記事では、C言語で未使用引数に関する警告を解決する方法を解説しています。引数名をunusedにする、(void)で明示的にキャストするなどの手法が紹介され、警告を抑制する際の注意点やベストプラクティスを提示しています。


■未使用引数の警告が出る例

#include    <stdio.h>
//未使用引数の警告が出る
void f(int argc,char *argv[]){
    printf("%s\n",argv[0]);
}
int main(int argc,char *argv[]){
    f(argc,argv);
}

未使用引数を削除できないか検討しましょう。
不要な引数であるならば削除しましょう。
static関数の場合は影響範囲がファイル内で閉じるので
積極的に修正しましょう。
外部関数の場合は影響範囲が広いので慎重な検討が必要です。

修正前:void f(int argc,char *argv[])
修正後:void f(char *argv[])


■単純には直せない時

関数ポインタテーブルから呼ばれて他の関数とインタフェースを統一する必要があるとか、
外部関数の影響範囲が広すぎてインタフェースを今さら修正できないときは
gcc -Wno-unused-parameter オプションで
警告を抑止する事もできます。

しかし一度この抑止オプションを使ってしまうとオプションを外す機会がなくなってしまい抑止オプション依存になってしまい、今後他の関数の不要な未使用引数を検出できなくなります。

この警告は多少面倒でも次のように修正すると良いでしょう。

■修正案A(unuse)

//(1):引数を unuse と言う名前に変更する
//->未使用だと人間には分る
#include    <stdio.h>
void f(int unuse,char *argv[]){
    printf("%s\n",argv[0]);
}
int main(int argc,char *argv[]){
    f(argc,argv);
}


1:未使用引数名をunused…に変える 
   ⇒未使用引数だと人間に分る


■修正案B(void)unuse

//(2):引数を(void)でキャストする
//->未使用だとコンパイラにも分る
#include    <stdio.h>
void f(int unuse,char *argv[]){
    (void)unuse;
    printf("%s\n",argv[0]);
}
int main(int argc,char *argv[]){
    f(argc,argv);
}


2:(void)でキャストする    
   ⇒未使用引数だとコンパイラにも分る


■修正案C(unuse++)

#include    <stdio.h>
void f(int unuse,char *argv[]){
    unuse++;
    printf("%s\n",argv[0]);
}
int main(int argc,char *argv[]){
    f(argc,argv);
}


3:(void)でキャストしても、gcc以外のコンパイラによっては警告が消えない場合があります。その場合、
unuse++ 
とすると警告が消える場合があります。
無駄なコードが発生するかもしれませんがコンパイラの最適化に期待しましょう。


■アンケート

13
あなたの使っているgcc警告オプションを教えてください

参考:

MSC12-C. プログラムに対して作用しないコードを検出して削除する