E2238 Plusieurs déclarations pour 'identificateur' (C++)

De RAD Studio
Aller à : navigation, rechercher

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é :

  1. Dans le Gestionnaire de projets, cliquez avec le bouton droit sur le fichier source qui contient les #include <iodbcunix.h> et #include <sqltypes.h>.
  2. Dans le menu contextuel, sélectionnez Modifier les options locales.
  3. Sur la page C++ (options partagées), cliquez sur les points de suspension [...] dans le champ Définitions conditionnelles.
  4. Sur la boîte de dialogue Définitions conditionnelles, ajoutez les entrées suivantes dans le champ d'entrée :
    _DWORD_DEFINED; _ULONG_DEFINED
  5. Cliquez sur Ajouter.
  6. Cliquez sur OK.