避免在typedef c ++中出现冲突的声明错误

时间:2012-01-14 22:09:37

标签: c++ gcc g++ typedef mysql++

有没有办法让g ++忽略或解决冲突的typedef?

背景

我正在为gridlab_d模拟器编写一些c ++代码。我的模型需要连接到c ++数据库,所以我使用的是mysql ++库。使用mysql ++库需要我链接到mysql库,所以我用

编译

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

问题:

gridlab中的mysql.h和list.h都为一个结构命名为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 个答案:

答案 0 :(得分:4)

也许预处理器包含解决您问题的方法。

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

当然,这依赖于gridlab而不是#include来自MySQL的任何东西。

答案 1 :(得分:2)

最佳解决方案:

1)保留当前的主程序

   EXAMPLE: "main.cpp"

2)为数据库访问编写 new 模块

   EXAMPLE: dbaccess.cpp, dbaccess.h

3)#include“main.cpp”中的“dbaccess.h”

您的dbaccess代码中不需要对gridlab的任何引用;你不需要在dbaccess。*代码之外引用mySql或mySQL列表。

问题解决了:)?

PS: 如果你真的需要某种可以在不同模块之间共享的“列表”,我建议你使用类似标准C ++“vector&lt;&gt;”的东西。 IMHO ...

答案 2 :(得分:0)

我假设你在多个文件中使用SSQLS。您是否阅读过有关在多个文件中使用SSQLS的说明。

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

答案 3 :(得分:0)

有两种可能性 - 两种列表类型兼容,或者它们不兼容。如果它们兼容,您只需将定义复制到新标题中,并在每个位置包含该标题。如果他们不兼容,您将不得不更改其中一个名称。

编辑:以下是我通过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技巧 - 注意如果您选择后一种路线,则不会犯任何错误。