E2238 Bezeichner 'bezeichner' mehrfach deklariert (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

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:

  1. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf die Quelldatei, die #include <iodbcunix.h> und #include <sqltypes.h> enthält.
  2. Wählen Sie im Kontextmenü Lokale Optionen bearbeiten.
  3. Klicken Sie auf der Seite C++ (Gemeinsame Optionen) im Feld Bedingungen auf die Ellipse [...].
  4. Fügen Sie im Dialogfeld Bedingungen die folgenden Einträge in das Eingabefeld ein:
    _DWORD_DEFINED; _ULONG_DEFINED
  5. Klicken Sie auf Hinzufügen.
  6. Klicken Sie auf OK.