E2238 Multiple declaration for 'identifier' (C++)
Go Up to Compiler Errors And Warnings (C++) Index
An identifier was improperly declared more than once.
This error might be caused by conflicting declarations, such as:
- int a; double a;
- A function declared in two different ways
- A label repeated in the same function
- Some declaration repeated, other than an extern function or a simple variable
Conflicting declarations can also happen by inadvertently including the same header file twice. For example, given:
//a.h
struct A { int a; };
//b.h
#include "a.h"
//myprog.cpp
#include "a.h"
#include "b.h"
myprog.cpp will get two declarations for the struct A. To protect against this, one would write the a.h header file as:
//a.h
#ifndef __A_H
#define __A_H
struct A { int a; };
#endif
This will allow one to safely include a.h several times in the same source code file.
Example Using RTL Headers and OS X Headers
In a multi-device application compiled for the OS X target platform, E2238 can occur because the OS X headers "iodbcunix.h" and "sqltypes.h" declare typedefs for DWORD and ULONG, and the C++Builder sysmac.h, which is included by System.hpp, also provides similar typedefs.
[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
If you must include "iodbcunix.h" and "sqltypes.h" in a translation unit that also uses the System.hpp header, use the following approach:
#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>
You can also specify these two macros in the local options of the affected source file:
- In the Project Manager, right-click the source file that contains the
#include <iodbcunix.h>
and#include <sqltypes.h>
. - From the context menu, select Edit local options.
- On the C++ (Shared Options) page, click the ellipsis [...] in the Conditional Defines field.
- On the Conditional Defines dialog box, add the following entries in the entry field:
_DWORD_DEFINED; _ULONG_DEFINED
- Click Add.
- Click OK.