C言語のコンパイラ警告C4098:戻り値エラーの原因と修正方法について解説
C言語 C4098は、戻り値の型がvoidと宣言されている関数で、returnステートメントによって値を返してしまう場合に発生するコンパイラ警告です。
この警告が表示されると、コードの記述に誤りがある可能性があるため、関数の定義を見直し、正しい書き方に修正する必要があります。
警告C4098の原因解析
void型関数とreturn文の本来の挙動
C言語やC++において、関数の戻り値型がvoidと宣言されている場合、その関数は値を返さないことが前提となります。
通常、void型関数内のreturnステートメントは値を伴わず、単に処理の終了を示すために使用されます。
例えば、以下のコードは正しい実装例です。
#include <stdio.h>
// 戻り値がないことを示す関数
void displayMessage(void) {
    // メッセージを表示する
    printf("Hello, World!\n");
    // 正しく、値を返さないreturn文
    return;
}
int main(void) {
    displayMessage();
    return 0;
}Hello, World!この例では、関数displayMessageはvoid型として定義され、return文は値を返していません。
関数の戻り値型とreturnステートメントの内容が一致することが求められます。
不正なreturn文が引き起こす型の不一致
一方、void型で宣言された関数内で、値を返すreturn文が記述されると、型の不一致が発生します。
コンパイラは、関数が結果として何らかの値(たとえばint型の値)を返すことを期待してしまい、警告C4098を出力します。
以下のコードは、不正な記述による警告例です。
#include <stdio.h>
// 戻り値がvoidであるにも関わらず値を返している関数
void wrongFunction(void) {
    // 警告C4098が発生する: void関数で値を返している
    return 1;
}
int main(void) {
    wrongFunction();
    return 0;
}この場合、戻り値の型がvoidに対して、返している値1との間に型の不一致が生じるため、コンパイラは該当箇所で警告を出します。
関数の本来の意図と戻り値の指定が一致していないことが原因です。
エラー発生パターンの検証
一般的なコード例における警告発生ケース
多くの場合、開発者は意図せずにvoid型関数内で値を返す記述をしてしまうことがあります。
たとえば、関数の実装時に処理結果を返す必要があると誤解し、以下のようなコードを書いてしまうケースが確認されています。
#include <stdio.h>
// 誤った実装: 本来返す必要がない関数で値を返している
void sampleFunction(void) {
    // 戻り値の不要な返却が原因で警告C4098が発生
    return 100;
}
int main(void) {
    sampleFunction();
    return 0;
}このような場合、コンパイラは「戻り値の型がvoidで宣言された関数が、値を返しました」という警告を表示します。
これにより、関数の意図と実装が正しく見直される必要があることが示唆されます。
コンパイラが出力する警告メッセージの解析
警告C4098は、コンパイラが以下のようなメッセージを出力するケースが多く見受けられます。
- 「’function’ : 戻り値の型が void で宣言された関数が、値を返しました」
この警告は、関数宣言と実装の間に齟齬がある場合に発生します。
関数定義がvoid型であれば、return文で値を返すべきではないことをコンパイラが指摘しています。
解析の際は、関数の戻り値型と実際のreturn文の内容を比べ、整合性を確認することが重要です。
修正方法の具体例
void型関数での正しい記述方法
void型関数の場合、値を返す必要はありません。
そのため、返している値を削除し、正しいreturn文または何も書かない形にする必要があります。
以下は、正しい記述方法の例です。
#include <stdio.h>
// 正しく実装されたvoid型の関数
void correctFunction(void) {
    // メッセージを表示する処理
    printf("This is a proper void function.\n");
    // return文に値は含めない(省略も可能)
    return;
}
int main(void) {
    correctFunction();
    return 0;
}This is a proper void function.不要なreturn文の削除ポイント
関数内において、不要な値を返すreturn文が記述されている場合、その値部分を削除することが必要です。
具体的には、以下のような点に注意します。
- 関数宣言がvoidであることを再確認する
- return文がある場合、返却値が記述されていないかチェックする
- 不要な返却値が存在する場合は、単にreturn;またはreturn文自体を削除する
関数定義の再確認と修正手順
関数の実装を見直す際は、以下の手順を参照してください。
- ファイル内の関数宣言と実装が一致しているか確認する
- void型関数内に返却値が含まれていないか検証する
- 返却値が必要な場合は、関数の戻り値型を適切な型(例えばintなど)に変更する
これらの手順に従うことで、型の不一致による警告を回避できるようになります。
コード改善事例の比較検証
修正前のコード例と警告内容の確認
修正前のコード例は、void型関数内に値を返す誤った記述があるため、警告C4098が発生します。
以下のコードはその一例です。
#include <stdio.h>
// 修正前の実装: void関数で値を返しているため警告発生
void problematicFunction(void) {
    // ここで値を返しているため、戻り値の型と矛盾
    return 10;
}
int main(void) {
    problematicFunction();
    return 0;
}このコードでは、コンパイラから「戻り値の型が void で宣言された関数が、値を返しました」という警告が出力されるため、修正が求められます。
修正後のコード例による動作検証
修正後は、void型関数内で値を返さないようにコードが改訂されます。
以下のコード例では、不要な返却値を削除し、正しい実装になっていることを示しています。
#include <stdio.h>
// 正しく修正されたvoid型関数
void fixedFunction(void) {
    // 処理内容を実行
    printf("修正済みの関数です。\n");
    // 値を返さない正しい記述
    return;
}
int main(void) {
    fixedFunction();
    return 0;
}修正済みの関数です。この修正例により、コンパイラ警告C4098は発生せず、関数の意図通りに動作することが確認できます。
まとめ
この記事では、C言語およびC++におけるvoid型関数の正しい使用法と、その中で値を返す誤りが警告C4098を引き起こす原因を解説しました。
不正なreturn文による型の不一致の問題を、具体例を用いて検証し、適切な修正方法を示しています。
これにより、型の不一致を回避し、正しい関数実装が理解できる内容となりました。
