E2238 '識別子' の宣言が複数存在します(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 ヘッダーと OS X ヘッダーを使用する例
OS X ターゲット プラットフォーム向けにコンパイルされるマルチデバイス アプリケーションの場合、E2238 エラーが発生するおそれがあるのは、OS X ヘッダー "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 OSX headers first
#include <sqltypes.h> // Include the OSX 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 つのマクロは、次のように、影響を受けるソース ファイルのローカル オプションで指定することもできます。
- [プロジェクト マネージャ]で、
#include <iodbcunix.h>
と#include <sqltypes.h>
が含まれているソース ファイルを右クリックします。 - コンテキスト メニューから、[ローカル オプションの編集...]を選択します。
- [C++ (共有オプション)]ページで、[条件定義]フィールドの参照([...])ボタンをクリックします。
- [条件定義]ダイアログ ボックスで、入力フィールドに次のエントリを追加します。
_DWORD_DEFINED; _ULONG_DEFINED
- [追加]をクリックします。
- [OK]をクリックします。