问题
Is there a way I can make g++ ignore or work around conflicting typedefs?
Background:
I'm writing some c++ code for the gridlab_d simulator. My model needs to connect to a c++ database, so I'm using the mysql++ library. use of the mysql++ library requires me to link to the mysql library, so i compile with
g++ -I/usr/include/mysql -I/usr/local/include/mysql++
Problem:
both mysql.h and list.h in gridlab typedef a struct to have the name LIST . Here is the compiler error
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'
Thanks for your help!
回答1:
Best solution:
1) Keep your current main program
EXAMPLE: "main.cpp"
2) Write a new module for your database access
EXAMPLE: dbaccess.cpp, dbaccess.h
3) #include "dbaccess.h" in main.cpp
You don't need any references to gridlab in your dbaccess code; you don't need to refer to mySql or mySQL lists outside of your dbaccess.* code.
Problem solved :)?
PS: If you really need some kind of "list" that you can share between different modules, I'd encourage you to use something like a standard C++ "vector<>". IMHO...
回答2:
Perhaps the preprocessor contains a solution to your problem.
#define LIST GRIDLAB_LIST
#include <gridlab_include_file.h>
#undef LIST
This relies, of course, on gridlab not #include
ing anything from MySQL.
回答3:
I assume you are using SSQLS in multiple files. Have you read the instruction about using SSQLS in multiple files.
http://tangentsoft.net/mysql++/doc/html/userman/ssqls.html#ssqls-in-header
回答4:
There are two possibilities - either the two list types are compatible, or they're not. If they are compatible, you can just copy the definition off into a new header and include that one from each location. If they're not compatible, you're going to have to change one of the names.
EDIT: Here are the two structure definitions that I found by doing some Google searching:
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;
Looking at those, it seems like you're not going to massage them into the same type. Change one of the names - either by doing a big search/replace or by using some clever #define
tricks - watch out that you don't make any mistakes if you choose the latter route.
来源:https://stackoverflow.com/questions/8865744/avoiding-conflicting-declaration-errors-in-typedef-c