コンパイラエラー

C言語のコンパイラエラー C2279の原因と対策について解説

コンパイラエラー C2279は、typedef宣言に例外指定(throw(…))を記述すると発生します。

/Zaオプション利用時には例外指定が許容されず、エラーとなります。

正しい宣言では例外指定を省略する必要があるため、typedefを記述する際は例外指定の付加に注意してください。

エラーC2279の発生原因

typedef宣言での例外指定に関する仕様

C言語で関数ポインタの型定義を行う際、例外指定を記述するとエラーが発生する場合があります。

特に、例外を意味する throw(...) を記述すると、typedef宣言内で不正な書式と判断されエラーとなります。

これは、例外仕様が関数宣言や定義に用いられるもので、型定義(typedef)の文脈では認められていないためです。

throw(…)指定が引き起こす影響

throw(...) 指定を含むことで、typedef宣言の構文が標準から外れるため、コンパイラはその記述をエラーとして報告します。

具体的には、例外仕様がメンバー定義や関数ポインタの型付けに含まれることを許容していないため、誤った用法と判断されるのです。

また、例外仕様を使用する場合でも、関数定義時にのみ意味を持つため、型の定義に含めると誤解を招くおそれがあります。

/Zaオプションの利用とエラー発生の関連性

/Zaオプションは、Microsoftのコンパイラにおいて標準準拠モードを有効にする設定です。

/Zaオプションを使用すると、コンパイラは標準に厳密なチェックを行い、拡張機能や非標準の記法を許容しません。

そのため、typedef宣言における例外指定(例えばthrow(...))も標準準拠の規則に則っていないため、エラーC2279が発生します。

コンパイル設定が厳格になることで、曖昧な記述は正確なエラーとして検出される仕組みとなっています。

コード例によるエラー解析

エラーを発生させるコード例の解説

以下のコード例は、throw(...) を含むtypedef宣言を使用することでエラーC2279を発生させる例です。

この例では、関数ポインタの型を定義する際に例外指定を加えているため、/Zaオプション使用下ではコンパイルエラーとなります。

throw(…)を使用した場合の挙動

#include <stdio.h>
// 以下のtypedef宣言は/Zaオプション使用時にエラー C2279 を発生させます
typedef int (*FunctionPointer)() throw(...);
int sampleFunction() {
    return 100;
}
int main(void) {
    FunctionPointer fp = sampleFunction;
    printf("Result: %d\n", fp());
    return 0;
}
error: typedef declaration cannot include exception specification (C2279)

上記のように、コンパイラはtypedef宣言内で例外指定が含まれているため、エラーを報告します。

正しい記述方法の検証

例外指定を省略した場合、typedef宣言は標準に準拠した形となり、エラーは発生しません。

以下のコード例は、例外指定を取り除いた正しい型定義とその利用例です。

例外指定を省略した場合の動作

#include <stdio.h>
// 例外指定を省略して正しい宣言に修正
typedef int (*FunctionPointer)();
int sampleFunction() {
    return 100;
}
int main(void) {
    FunctionPointer fp = sampleFunction;
    printf("Result: %d\n", fp());
    return 0;
}
Result: 100

このコードでは、例外指定を除外することで、typedef宣言が正しく定義され、main関数の中で正常に関数ポインタを利用できることが確認できます。

エラー修正と対策

例外指定を除外する修正方法

エラー修正の最も直接的な方法は、typedef宣言から例外指定throw(...)を取り除くことです。

例外仕様は関数定義の際にのみ必要となるため、型定義に利用する必要はありません。

下記のコード例は、例外指定を除外して正しい宣言とした例です。

#include <stdio.h>
// 修正後の正しい型定義(例外指定を除外)
typedef int (*FunctionPointer)();
int sampleFunction() {
    return 100;
}
int main(void) {
    FunctionPointer fp = sampleFunction;
    printf("Result: %d\n", fp());
    return 0;
}
Result: 100

コンパイラオプションの設定変更による対処方法

/Zaオプションがエラー発生の一因である場合、プロジェクトのコンパイラオプションを変更する方法も対策のひとつです。

以下は、コンパイラオプションの設定変更手順の一例です。

  • Visual Studioを利用している場合
    • プロジェクトのプロパティを開く
    • 「C/C++」→「詳細設定」を選択
    • 「Microsoft拡張を使用する」の設定を「はい」に変更する、または/Zaオプションを無効にする
  • コマンドラインでコンパイルしている場合
    • /Zaオプションの指定を除去する、または/Zeオプション(Microsoft拡張の有効化)を利用する

これにより、例外指定を含む記述が許容される可能性があり、エラーC2279の発生を回避できる場合があります。

ただし、プロジェクト全体のコンパイル方針に影響を及ぼすため、変更の際は他のコードへの影響も確認する必要があります。

まとめ

本記事では、コンパイラエラーC2279の原因として、typedef宣言内での例外指定throw(...)が原因である点と、/Zaオプションが標準準拠の厳格なチェックを実施するためエラーが発生する点が解説されています。

さらに、エラー発生時と正常な動作が確認できるコード例を示し、例外指定の除外やコンパイラオプションの変更により対処可能な方法を紹介しています。

関連記事

Back to top button
目次へ