C言語のC2562エラーについて解説
void
と宣言された関数内で、値を返してしまった際に発生します。
コード中のreturn
文が不要な場合は削除し、必要であれば関数の戻り値の型を正しく設定することでエラーが解消されます。
開発時には関数宣言と定義の整合性に注意することが重要です。
エラー概要
エラーメッセージの内容
コンパイラが表示するエラーメッセージは「’identifier’: 戻り値の型が void
で宣言された関数が、値を返しました」となります。
このメッセージは、戻り値が不要な void
関数内で return
文に値が含まれている場合に発生します。
コンパイラは関数の宣言と定義が一致しないと判断し、意図しない動作を防ぐためにエラーを出す設定となっています。
発生状況の確認
エラーが発生する状況としては以下のケースが考えられます。
- 関数プロトタイプで戻り値の型を
void
として宣言しているが、実際の関数定義内で値を返している場合 - 関数実装時に誤って値を返す
return
文を記述している場合
実際の開発環境においては、コンパイラがソースコードのどの部分で不一致が発生しているかを示すため、エラーメッセージに原因の箇所を明確に示します。
原因分析
関数宣言と定義の不整合
C言語では、関数プロトタイプで定義された戻り値の型と、実際の関数定義での戻り値の型が一致する必要があります。
関数の宣言と定義が不整合な場合、コンパイラはエラー C2562 を発生させます。
具体的には、void
として宣言された関数内で、誤って何らかの値を返す記述があるとエラーとなります。
void関数でのreturn文の問題
void
関数は返却値がないため、return
文を使用する場合は値を指定せずに単独で記述する必要があります。
以下のサンプルコードは、void
関数内で値を返すためにエラーが発生する例です。
#include <stdio.h>
// 間違った実装例: void関数で値を返しているためエラーが発生する
void testFunction() {
int i = 10;
// 以下の行がエラー: 関数は値を返さない設定なので、不適切なreturn文となる
return i;
}
int main(void) {
testFunction();
return 0;
}
(エラーメッセージ例)
C2562: 'testFunction': 戻り値の型が 'void' で宣言された関数が、値を返しました
コード例によるエラー発生例
誤った関数実装のパターン
実例として、以下のコードは void
関数として宣言された displayValue
内で誤って値を返してしまうパターンです。
このような実装は、関数プロトタイプと実装間の不整合として認識され、C2562 エラーが発生します。
#include <stdio.h>
// void関数として宣言しているが、値を返しているためエラーになる例
void displayValue() {
int value = 25;
// 不要なreturn文: 値を返す必要はない
return value;
}
int main(void) {
displayValue();
return 0;
}
(エラーメッセージ例)
C2562: 'displayValue': 戻り値の型が 'void' で宣言された関数が、値を返しました
対処方法
不要なreturn文の削除方法
void
関数の場合、値を返す必要はありません。
そのため、誤って記述された値を返す return
文を削除することでエラーを解消できます。
上記の displayValue
関数の場合、以下のように return
文から返却値を削除します。
#include <stdio.h>
// 修正例: void関数内では値を返さないため、単独のreturn文にするか削除する
void displayValue() {
int value = 25;
// 値を返さないので単純に関数を終了させる
return;
}
int main(void) {
displayValue();
return 0;
}
(実行結果)
※ 正常にコンパイルされ、プログラムはエラーなく終了します
戻り値型の修正方法
正しい関数宣言と定義の例
もし関数が実際に値を返す必要がある場合は、関数の戻り値型を適切に指定する必要があります。
例えば、int
を返す関数として宣言と定義を行うことで、以下のようにエラーは発生しなくなります。
#include <stdio.h>
// 正しい実装例: 戻り値型をintに変更して、値を返す
int testFunction() {
int i = 10;
return i; // 修正済み: 関数の戻り値型がintなので問題なし
}
int main(void) {
// 関数から返された値を変数resultに受け取る
int result = testFunction();
// 結果を表示
printf("Result: %d\n", result);
return 0;
}
Result: 10
このように、関数の目的に応じた戻り値型に修正することでコンパイルエラーを解消できます。
開発環境での確認事項
コンパイラオプションのチェック
開発環境では、コンパイラのオプションがエラー検出に大きく影響する場合があります。
特に、MicrosoftのC/C++コンパイラでは、特定のオプションの有無によっては、エラーの検出レベルが変わるケースがあります。
プロジェクトの設定やビルドスクリプトを確認し、オプションが意図した通りに設定されているか確認してください。
/cオプションの利用状況確認
例えば、コンパイル時に /c
オプションが使用されている場合、ソースコードのコンパイル時に複数のファイルが正しく連携されるか、もしくは独立ファイルとしてコンパイルされるかを注視する必要があります。
以下は、簡単な検証用のプログラムと、その確認方法の例です。
#include <stdio.h>
// /cオプション下でのコンパイルテストプログラム
void checkFunction() {
int num = 5;
// 単一のreturn文として記述し、値は返さない
return;
}
int main(void) {
// checkFunctionを呼び出し、処理が正常に終了することを確認
checkFunction();
printf("Compile test successful.\n");
return 0;
}
Compile test successful.
この例では、/c
オプションを使用してもコンパイルエラーが発生しないよう設定されていることを確認できます。
開発環境のビルド設定に問題がないかも含め、オプションのチェックを忘れずに行ってください。
まとめ
本記事では、コンパイラエラー C2562 の原因として、void関数内で値が返される不整合について解説しました。
エラーメッセージの内容や実際の発生状況を確認し、不要な return文の削除や戻り値型の修正という対処方法を示しました。
さらに、コンパイルオプション、特に /c オプションの利用状況を確認する重要性についても述べました。