Как избежать конфликтующих ошибок объявления в typedef c ++ - PullRequest
3 голосов
/ 15 января 2012

Есть ли способ заставить g ++ игнорировать или обходить конфликтующие определения типов?

Справочная информация:

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

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

Проблема:

и mysql.h, и list.h в gridlab набирают для определения структуры имя LIST. Вот ошибка компилятора

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'

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

Ответы [ 4 ]

4 голосов
/ 15 января 2012

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

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

Конечно, это зависит от того, что gridlab не #include что-либо из MySQL.

2 голосов
/ 15 января 2012

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

1) Сохраните текущую основную программу

   EXAMPLE: "main.cpp"

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

   EXAMPLE: dbaccess.cpp, dbaccess.h

3) #include "dbaccess.h" в main.cpp

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

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

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

0 голосов
/ 15 января 2012

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

РЕДАКТИРОВАТЬ: Вот два определения структуры, которые я нашел, выполнив поиск в 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 голосов
/ 15 января 2012

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

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

...