最終更新日 2025年11月18日
warning: left-hand operand of comma expression has no effect
警告:コンマ演算子の左側無意味
[-Wunused-value]
■この記事の概要
C言語でのデバッグ用printfをリリース時に無効にする方法を解説。
この記事では、コンパイル時にデバッグコードを除去する手法として、可変引数マクロの活用と、警告を回避するための具体的な構文について説明しています。
■#ifdefだらけを避けたい
#include <stdio.h>
int main(void)
{
#ifdef DEBUG
printf("デバッグ開始\n");
#endif
//処理色々
#ifdef DEBUG
printf("%s\n",__FILE__);
#endif
//処理色々
#ifdef DEBUG
printf("%s\n",__func__);
#endif
//処理色々
#ifdef DEBUG
printf("%d\n",__LINE__);
#endif
}DEBUG文で
#ifdefだらけ
条件コンパイルだらけにすると
コードが読み読みづらいです。
DEBUG文は地味にしましょう。
■コンパイル時警告が出る非推奨修正案
#include <stdio.h>
//警告の出るデバッグ文
#ifdef DEBUG
#define DEBUG_printf printf
#else
#define DEBUG_printf
#endif
int main(void)
{
DEBUG_printf("デバッグ開始\n");
//処理色々
DEBUG_printf("%s\n",__FILE__);
//処理色々
DEBUG_printf("%s\n",__func__);
//処理色々
DEBUG_printf("%d\n",__LINE__);
}
上記のコードは デバッグ用に
gcc -DDEBUG でコンパイルすると
警告はでません。
しかし製品出荷用に
gcc -Dオプション無しでコンパイルすると
DEBUG_print(“%s\n”,__FILE__) の行は
(“%s\n”,__FILE__) とマクロ展開され
何もしないコンマ演算子だけが残ります。
関数引数のコンマはコンマ演算子ではないのですが、
マクロ展開により DEBUG_print が消えてしまうと
(“%s\n”,__FILE__) は関数引数ではなくてコンマ演算子となります。
このコンマ演算子はコンパイルエラーにはならないのですが、
何もしないので警告が発生します。
■可変引数マクロ(…)を使う推奨修正案
#include <stdio.h>
//警告の出ないデバッグ文
#ifdef DEBUG
#define DEBUG_printf printf
#else
#define DEBUG_printf(...) /*空*/
#endif
int main(void)
{
DEBUG_printf("デバッグ開始\n");
//処理色々
DEBUG_printf("%s\n",__FILE__);
//処理色々
DEBUG_printf("%s\n",__func__);
//処理色々
DEBUG_printf("%d\n",__LINE__);
}