Éviter un concours de déclaration des erreurs dans la définition de type c++
Est-il une manière que je peux faire de g++ ignorer ou contourner contradictoires typedefs?
De fond:
Je suis à écrire du code c++ pour la gridlab_d simulateur. Mon modèle a besoin de se connecter à un c++, base de données, donc je suis en utilisant la base de données mysql++ de la bibliothèque. utilisation de mysql++ de la bibliothèque m'oblige à lier à la base de la bibliothèque, donc je compile avec
g++ -I/usr/include/mysql -I/usr/local/include/mysql++
Problème:
mysql.h et liste.h en gridlab un typedef struct avoir le nom de la LISTE . Voici l'erreur du compilateur
In file included from /usr/include/mysql/mysql.h:76,
from /usr/include/mysql++/common.h:182,
from /usr/include/mysql++/connection.h:38,
from /usr/include/mysql++/mysql++.h:56,
from direct_data.cpp:21:
/usr/include/mysql/my_list.h: At global scope:
/usr/include/mysql/my_list.h:26: error: conflicting declaration 'typedef struct st_list LIST'
../core/list.h:22: error: 'LIST' has a previous declaration as 'typedef struct s_list LIST'
Merci pour votre aide!
Ne pouvez-vous pas mettre
Peut-être que vous pourriez créer votre propre abstractions qui peuvent être compilés séparément, de façon à la fois typedefs n'apparaissent pas dans la même unité de compilation.
#ifndef
autour de la définit?Peut-être que vous pourriez créer votre propre abstractions qui peuvent être compilés séparément, de façon à la fois typedefs n'apparaissent pas dans la même unité de compilation.
OriginalL'auteur Vikas Yendluri | 2012-01-14
Vous devez vous connecter pour publier un commentaire.
Meilleure solution:
1) Gardez votre programme principal
2) Écrire un nouveau module pour votre base de données access
3) #include "dbaccess.h" dans main.cpp
Vous n'avez pas besoin de toutes les références à gridlab dans votre dbaccess code; vous n'avez pas besoin de se référer à mySql ou mySQL listes à l'extérieur de votre dbaccess.* code.
Problème résolu :)?
PS:
Si vous avez vraiment besoin d'une sorte de "liste" que vous pouvez partager entre les différents modules, je vous encourage à utiliser quelque chose comme un standard C++ "vector<>". À mon humble avis...
si je devais le faire, j'aurais besoin d'inclure mysql++.h dans dbaccess.h. alors j'aurais besoin d'inclure dbaccess.h en main.cpp. depuis main.cpp devrait également inclure le gridlab.h-tête, j'ai toujours le visage de la même contradictoires déclaration d'erreur. Comment puis-je contourner ce problème?
Non, ne comprennent pas mysql++.h dans dbaccess.h, uniquement dans dbaccess.cpp. Le point est de définir votre propre privé abstraction enroulé autour de la crue accès MySQL. (La plupart de votre code ne doit pas être couplé à une base de données spécifique de toute façon!)
ok, qui fait sens 🙂
OriginalL'auteur paulsm4
Peut-être le préprocesseur contient une solution à votre problème.
Cela repose, évidemment, sur gridlab pas
#include
ing rien de MySQL.Essentiellement, il provoque le pré-processeur pour faire une simple textuelle de remplacement de
LIST
avecGRIDLAB_LIST
everyplace oùLIST
se produit. DepuisLIST
est un typedef, il n'y a aucune chance (même avec le C++) le nom n'est jamais mentionné dans le fichier de l'objet. Il ne causera pas de la compilation ou à la liaison des problèmes.À moins qu'il y est le code qui a besoin d'utiliser les deux types de type de liste, c'est un bon début. En fait - et même alors, il est OK aussi longtemps que vous utilisez GRIDLAB_LIST dans les bons endroits dans le code partagé.
C'est ce que je pensais.
OriginalL'auteur Omnifarious
Je suppose que vous êtes en utilisant SSQLS dans plusieurs fichiers. Avez-vous de lire les instructions sur l'utilisation de SSQLS dans plusieurs fichiers.
http://tangentsoft.net/mysql++/doc/html/userman/ssqls.html#ssqls-dans-d'en-tête
OriginalL'auteur Adrian Cornish
Il y a deux possibilités - soit les deux types de listes sont compatibles, ou ils ne le sont pas. Si ils sont compatible, vous pouvez simplement copier la définition en une nouvelle en-tête et de l'inclure l'un à partir de chaque emplacement. Si ils ne sont pas compatible, vous allez avoir à changer des noms.
EDIT: Voici les deux définitions de structure que j'ai trouvé en faisant quelques recherche sur Google:
MySQL:
Gridlab:
En regardant celles-ci, il semble que vous n'allez pas les massages dans le même type. Changement de l'un des noms, - soit par une grosse rechercher/remplacer ou à l'aide de quelques petits malins
#define
astuces - attention de ne pas faire d'erreur si vous choisissez cette dernière voie.Omnifarious " réponse en est un exemple.
OriginalL'auteur Carl Norum