有没有办法让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'
感谢您的帮助!
答案 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
技巧 - 注意如果您选择后一种路线,则不会犯任何错误。