E2238 Plusieurs déclarations pour 'identificateur' (C++)
Remonter à Erreurs et avertissements du compilateur (C++) - Index
Un identificateur a été incorrectement déclaré plusieurs fois.
L'erreur peut être provoquée par des déclarations conflictuelles, telles que :
- int a; double a;
- Une fonction déclarée de deux façons différentes
- Un libellé répété dans la même fonction
- Une déclaration répétée ailleurs que dans une fonction externe ou une variable simple
Les déclarations conflictuelles peuvent également se produire en incluant par inadvertance le même fichier d'en-tête deux fois. Par exemple, avec :
//a.h
struct A { int a; };
//b.h
#include "a.h"
//myprog.cpp
#include "a.h"
#include "b.h"
myprog.cpp aura deux déclarations pour struct A. Pour empêcher ceci, écrivez le fichier d'en-tête a.h de la façon suivante :
//a.h
#ifndef __A_H
#define __A_H
struct A { int a; };
#endif
Ceci vous permettra d'inclure a.h sans risque plusieurs fois dans le même fichier de code source.
Exemple d'utilisation des en-têtes RTL et macOS
Dans une application multi-périphérique compilée pour la plate-forme cible macOS, E2238 peut se produire car les en-têtes macOS "iodbcunix.h" et "sqltypes.h" déclarent des typedefs pour DWORD et ULONG, et l'en-tête C++Builder sysmac.h, inclus par System.hpp, fournit également des typedefs similaires.
[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
Si vous devez inclure "iodbcunix.h" et "sqltypes.h" dans une unité de traduction qui utilise également l'en-tête System.hpp, utilisez l'approche suivante :
#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>
Vous pouvez également spécifier ces deux macros dans les options locales du fichier source affecté :
- Dans le Gestionnaire de projets, cliquez avec le bouton droit sur le fichier source qui contient les
#include <iodbcunix.h>
et#include <sqltypes.h>
. - Dans le menu contextuel, sélectionnez Modifier les options locales.
- Sur la page C++ (options partagées), cliquez sur les points de suspension [...] dans le champ Définitions conditionnelles.
- Sur la boîte de dialogue Définitions conditionnelles, ajoutez les entrées suivantes dans le champ d'entrée :
_DWORD_DEFINED; _ULONG_DEFINED
- Cliquez sur Ajouter.
- Cliquez sur OK.