2012-01-14 3 views
3

Есть ли способ заставить g ++ игнорировать или работать с конфликтующими typedefs?Избежать противоречивых ошибок объявления в typedef C++

фон:

Я пишу некоторые C++ кода для gridlab_d тренажера. Моей модели необходимо подключиться к базе данных C++, поэтому я использую библиотеку mysql ++. использование MySQL ++ библиотека требует от меня, чтобы связать с библиотекой MySQL, поэтому я компилировать с

g++ -I/usr/include/mysql -I/usr/local/include/mysql++

Проблема:

как mysql.h и list.h в gridlab ЬурейеЕ в структуры, чтобы иметь имя СПИСОК. Вот ошибка компилятора

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' 

Спасибо за вашу помощь!

+0

Не можете ли вы поставить '# ifndef' вокруг одного из определений? – lapk

+2

Возможно, вы могли бы создать свои собственные абстракции, которые могут быть скомпилированы независимо, поэтому оба типа typedef не отображаются в одном модуле компиляции. –

ответ

2

Лучшее решение:

1) Держите ваш текущий основной программы

EXAMPLE: "main.cpp" 

2) Написать новый модуль для доступа к базе данных

EXAMPLE: dbaccess.cpp, dbaccess.h 

3) #include «DBAccess .h "в основном.cpp

Вам не нужны ссылки на gridlab в коде dbaccess; вам не нужно ссылаться на списки mySql или mySQL за пределами вашего кода dbaccess. *.

Проблема решена :)?

PS: Если вам действительно нужен какой-то «список», который вы можете разделить между различными модулями, я бы посоветовал вам использовать что-то вроде стандартного C++ «vector <>». IMHO ...

+0

Это тоже идея, и намного чище, чем моя идея. :-) – Omnifarious

+0

Если бы я это сделал, мне нужно было бы включить mysql ++. H в dbaccess.h. то мне нужно будет включить dbaccess.h в main.cpp. поскольку main.cpp также будет включать заголовок gridlab.h, я все равно столкнулся бы с той же противоречивой декларацией объявления. Как мне обойти это? –

+0

Нет, не включайте mysql ++. H в dbaccess.h, только в dbaccess.cpp. Дело в том, чтобы определить вашу собственную частную абстракцию, обернутую вокруг необработанного доступа MySQL. (Большая часть вашего кода не должна быть привязана к конкретной базе данных!) –

0

Предполагаю, что вы используете SSQLS в нескольких файлах. Вы прочитали инструкцию об использовании SSQLS в нескольких файлах.

http://tangentsoft.net/mysql++/doc/html/userman/ssqls.html#ssqls-in-header

+0

Спасибо за ваш ответ. Оказывается, я не использую SSQLS в нескольких файлах. раздел, на который вы ссылаетесь, ссылается на определение настраиваемых схем SSQLS для mysql ++, моя ошибка из библиотек в целом без специального SSQL с моей стороны. –

0

Есть две возможности - либо два типа списка совместимы, или это не так. Если они совместимы, вы можете просто скопировать определение в новый заголовок и включить его из каждого места. Если они не совместимы, вам придется изменить одно из имен.

EDIT: Вот два определения структуры, которые я нашел, делая некоторые поиска Google:

MySQL:

typedef struct st_list { 
    struct st_list *prev,*next; 
    void *data; 
} LIST; 

Gridlab:

typedef struct s_listitem { 
    void *data; 
    struct s_listitem *prev; 
    struct s_listitem *next; 
} LISTITEM; 

typedef struct s_list { 
    unsigned int size; 
    LISTITEM *first; 
    LISTITEM *last; 
} LIST; 

Глядя на них, кажется, вы не собираетесь массировать их в одном типе. Измените одно из имен - либо выполнив большой поиск/замену, либо используя некоторые умные #define трюки - следите за тем, чтобы вы не ошибались, если выбрали последний маршрут.

+0

Какие умные определения трюков вы имели в виду? :) –

+0

@VikasYendluri - Omnifarious 'ответ - пример. –

4

Возможно, препроцессор содержит решение вашей проблемы.

#define LIST GRIDLAB_LIST 
#include <gridlab_include_file.h> 
#undef LIST 

Это зависит, конечно, от gridlab не #include ничего из MySQL Инг.

+0

интересно, как это работает? –

+0

@VikasYendluri - В основном это приводит к тому, что предварительный процессор выполняет обычную текстовую замену 'LIST'' GRIDLAB_LIST' везде, где встречается 'LIST'. Поскольку 'LIST' является typedef, нет никаких шансов, что (даже с C++) это имя упоминается в результирующем объектном файле. Это не вызовет проблем с компиляцией или связыванием. – Omnifarious

+0

Если не существует кода, который должен использовать оба типа списка, это хороший старт. Фактически - даже тогда все в порядке, пока вы используете GRIDLAB_LIST в правильных местах общего кода. –

Смежные вопросы