E2238 '識別子' の宣言が複数存在します(C++)

提供: RAD Studio
移動先: 案内検索

コンパイラのエラーと警告(C++):インデックス への移動

識別子が複数回宣言されていますが、これは不適切です。

このエラーは、宣言の競合(たとえば次のような場合)で発生するおそれがあります。

  • int a; double a;
  • 関数に 2 つの異なる宣言がある場合
  • 同じ関数でラベルが繰り返されている場合
  • extern 関数または単純変数以外の宣言が繰り返されている場合

同じヘッダー ファイルをうっかり 2 回インクルードしても、宣言の競合は発生します。たとえば、次の例を考えてみましょう。

 //a.h
 struct A { int a; };
 //b.h
 #include "a.h"
 //myprog.cpp
 #include "a.h"
 #include "b.h"

myprog.cpp では、struct A の宣言が 2 回行われることになります。これを防ぐには、a.h ヘッダー ファイルを次のように記述します。

 //a.h
 #ifndef __A_H
 #define __A_H
 struct A { int a; };
 #endif

これにより、同じソース コード ファイルに a.h を何回でも安全にインクルードできます。

RTL ヘッダーと macOS ヘッダーを使用する例

macOS ターゲット プラットフォーム向けにコンパイルされるマルチデバイス アプリケーションの場合、E2238 エラーが発生するおそれがあるのは、macOS ヘッダー "iodbcunix.h" および "sqltypes.h" に DWORD と ULONG の typedef 宣言が含まれているためと、C++Builder の sysmac.h(System.hpp でインクルードされている)にも同様の typedef が含まれているためです。

[bccosx Error] iodbcunix.h(128): E2238 Multiple declaration for 'DWORD'
  Full parser context
    Unit1.cpp(10): #include c:\program files (x86)\embarcadero\studio\16.0\include\osx\crtl\iodbcunix.h
[bccosx Error] sysmac.h(1279): E2344 Earlier declaration of 'DWORD'
  Full parser context
    Unit1.cpp(10): #include c:\program files (x86)\embarcadero\studio\16.0\include\osx\crtl\iodbcunix.h

System.hpp ヘッダーを使用するトランスレーション ユニットに "iodbcunix.h" と "sqltypes.h" もインクルードする必要がある場合は、次のアプローチを用います。

#include <iodbcunix.h> // Include the macOS headers first
#include <sqltypes.h>  // Include the macOS headers first 
 
#define _DWORD_DEFINED // Define the _DWORD_DEFINED macro to prevent a new declaration of DWORD
#define _ULONG_DEFINED // Define the _ULONG_DEFINED macro to prevent a new declaration of ULONG
#include <System.hpp>

これら 2 つのマクロは、次のように、影響を受けるソース ファイルのローカル オプションで指定することもできます。

  1. [プロジェクト マネージャ]で、#include <iodbcunix.h>#include <sqltypes.h> が含まれているソース ファイルを右クリックします。
  2. コンテキスト メニューから、[ローカル オプションの編集...]を選択します。
  3. [C++ (共有オプション)]ページで、[条件定義]フィールドの参照([...])ボタンをクリックします。
  4. [条件定義]ダイアログ ボックスで、入力フィールドに次のエントリを追加します。
    _DWORD_DEFINED; _ULONG_DEFINED
  5. [追加]をクリックします。
  6. [OK]をクリックします。