コンパイラの警告

C言語で発生するC4138警告の原因と対策について解説

C言語で発生するMicrosoftコンパイラ警告C4138は、開始コメント記号がない状態で閉じコメント記号*/を使用した場合に表示されます。

誤った入れ子のコメント記述が原因となるため、正しいコメントの記述方法を確認しながらコードを作成することが推奨されます。

警告C4138の発生要因

C言語におけるコメント記述ルール

正しいコメントの記述方法

C言語では、コメントは開始デリミターの/*と終了デリミターの*/で囲む必要があります。

コメント内に誤ったデリミターが混入しないよう、順序に注意する必要があります。

例えば、以下のコードは正しくコメントが記述されています。

#include <stdio.h>
int main(void) {
    /* このコメントは正しく記述されています */
    printf("Hello, World!\n");
    return 0;
}

上記の例のように、開始と終了の両方の記号が正しい順番で記述されていれば、コンパイラは警告を出しません。

コメントの入れ子禁止について

C言語では、コメントの入れ子(nested comments)は認められていません。

コード内に/*を複数使用する場合、最初の*/で最初のコメントが終了してしまうため、その後のコメント部分が意図しない動作になります。

入れ子にせず、必要な部分だけコメントアウトするか、複数行のコメントが必要な場合は、複数のコメントブロックに分ける必要があります。

誤ったコメント記述の具体例

始まりのデリミター不足の事例

以下の例では、閉じコメントデリミター*/の前に開始デリミター/*が不足しているため、警告C4138が発生します。

#include <stdio.h>
// 以下の変数定義では、クローズのコメント記号が先に出現してしまっています
int */*comment*/ptr;   // コンパイラは曖昧な最初のデリミターに対して警告を出します
int main(void) {
    printf("Warning C4138 Example\n");
    return 0;
}

閉じコメント記号の誤用事例

次の例は、コメントの閉じ記号が誤って使われたケースです。

開始デリミターなしに閉じ記号が存在するため、コンパイラは警告を出します。

#include <stdio.h>
// 本来必要な開始デリミターがない状態で、終了記号が使用されています
int someVariable*/;   // 閉じコメント記号が誤って使用されている例
int main(void) {
    printf("Error with closing delimiter\n");
    return 0;
}

警告C4138が発生する状況

コンパイラメッセージの解説

実際の警告メッセージは「始まりのデリミターがない閉じのコメントデリミター (*/) が見つかりました。」という内容です。

このメッセージは、コンパイラがコメントブロックを正しく認識できなかった場合に出力されます。

警告C4138は、主にコメントの開始と終了の不整合が原因で発生する警告です。

エラー発生の環境と条件

この警告は、特に以下のような状況で発生することが多いです。

  • 複数行コメント内で不適切な文字列操作が行われた場合
  • コメントアウトのためにコード全体を囲む際に、誤ってネストされたコメントが存在する場合
  • 不適切な方法でコードの一部を無効化しようとした場合

複雑なコメント利用時の注意点

複雑なコメントを利用する際は、必ず開始と終了のペアを確認してください。

ネストが必要な場合は、コメントアウトする範囲を#if 0#endifで囲む方法も有効です。

また、テキストエディタのシンタックスハイライト機能を活用することで、コメントの不整合に早く気付くことが可能です。

警告C4138の対策方法

コメント記述の修正方法

正しいコメント記述例の提示

以下は、正しく記述されたコメントの例です。

意図しないネストがなく、すべての開始記号に対して正しく終了記号が存在しています。

#include <stdio.h>
int main(void) {
    /* これは正しいコメント記述の例です */
    printf("Correct comment example\n");
    return 0;
}

この例は、コメントの開始/*と終了*/が正しく使用されているため、警告が発生しません。

#if/#endifブロックを用いた対応

コードの一部を無効化する場合、コメントを利用するのではなく、プリプロセッサの#if 0#endifを使用する方法もあります。

これにより、コメントの不整合による警告を回避することが可能です。

#include <stdio.h>
#if 0
// 以下のコードは無効化されていますが、コメント内の不整合が発生しません。
// int deprecatedVariable;  /* 現在使用しない変数 */
#endif
int main(void) {
    printf("Using #if 0 block to disable code\n");
    return 0;
}

修正後の検証手順

コンパイル環境における警告確認方法

修正後は、以下の手順で正しく警告が解消されたことを確認してください。

  • 整合性が取れたコードを含むファイルを保存します。
  • 使用している開発環境上で、プロジェクトをビルドまたはコンパイルします。
  • コンパイラの出力結果を確認し、警告C4138が表示されないことを確認してください。

具体的には、Visual Studioやgccなどのコンパイラで、

警告メッセージがなく、正しい実行結果が表示されること

を確認することが推奨されます。

まとめ

この記事では、C言語における警告C4138の原因を、正しいコメント記述法と入れ子コメントの禁止規則、具体的な誤記述例を通して解説しました。

また、実際に警告が発生する状況や環境条件を説明し、正しいコメント記述例および#if 0ブロックを用いた対策方法を紹介しています。

読者は、適切なコメント記述と確認手順により、警告C4138を回避する方法を理解することができます。

関連記事

Back to top button
目次へ