E2238 Bezeichner 'bezeichner' mehrfach deklariert (C++)
Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index
Ein Bezeichner wurde fälschlicherweise mehrfach deklariert.
Dieser Fehler kann aus widersprüchlichen Angaben herrühren, wie:
- int a; double a;
- Einer auf zweierlei Weise deklarierten Funktion
- Einer wiederholten Sprungmarke in derselben Funktion
- Einer wiederholten Deklaration, außer bei einer extern-Funktion oder einer einfachen Variable
Widersprüchliche Deklarationen können auch vorkommen, wenn die gleiche Header-Datei zweimal eingebunden wird. Zum Beispiel:
//a.h
struct A { int a; };
//b.h
#include "a.h"
//myprog.cpp
#include "a.h"
#include "b.h"
myprog.cpp erhält zwei Deklarationen für struct A. Um dies zu verhindern, schreiben Sie am besten in der Header-Datei a.h:
//a.h
#ifndef __A_H
#define __A_H
struct A { int a; };
#endif
Damit können Sie a.h mehrmals sicher in dieselbe Quelltextdatei einbinden.
Beispiel für die Verwendung von RTL-Headern und macOS-Headern
In einer für die macOS-Zielplattform compilierten geräteübergreifenden Anwendung kann der Fehler E2238 auftreten, weil die macOS-Header "iodbcunix.h" und "sqltypes.h" Typedefs für DWORD und ULONG deklarieren, und in der von "System.hpp" einbezogenen C++Builder-Datei sysmac.h ebenfalls Typedefs dafür vorhanden sind.
[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
Wenn Sie "iodbcunix.h" und "sqltypes.h" in eine Übersetzungs-Unit, die auch den System.hpp-Header verwendet, einbinden müssen, verwenden Sie die folgende Methode:
#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>
Sie können auch diese beiden Makros in den lokalen Optionen der betroffenen Quelldatei angeben:
- Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf die Quelldatei, die
#include <iodbcunix.h>
und#include <sqltypes.h>
enthält. - Wählen Sie im Kontextmenü Lokale Optionen bearbeiten.
- Klicken Sie auf der Seite C++ (Gemeinsame Optionen) im Feld Bedingungen auf die Ellipse [...].
- Fügen Sie im Dialogfeld Bedingungen die folgenden Einträge in das Eingabefeld ein:
_DWORD_DEFINED; _ULONG_DEFINED
- Klicken Sie auf Hinzufügen.
- Klicken Sie auf OK.