4

g ++に競合するtypedefを無視または回避させる方法はありますか?

バックグラウンド:

gridlab_dシミュレーター用のc++コードを書いています。モデルはc++データベースに接続する必要があるため、mysql++ライブラリを使用しています。mysql ++ライブラリを使用するには、mysqlライブラリにリンクする必要があるため、次のコマンドでコンパイルします。

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

問題:

gridlab typedefの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

4 に答える 4

6

おそらく、プリプロセッサには問題の解決策が含まれています。

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

#includeもちろん、これは、 MySQLから何も取得しないgridlabに依存しています。

于 2012-01-14T22:16:49.430 に答える
2

最善の解決策:

1)現在のメインプログラムを維持する

   EXAMPLE: "main.cpp"

2)データベースアクセス用の新しいモジュールを作成します

   EXAMPLE: dbaccess.cpp, dbaccess.h

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

dbaccessコードでgridlabへの参照は必要ありません。dbaccess。*コードの外部でmySqlまたはmySQLリストを参照する必要はありません。

問題が解決しました :)?

PS:異なるモジュール間で共有できるある種の「リスト」が本当に必要な場合は、標準のC++「vector<>」のようなものを使用することをお勧めします。私見では...

于 2012-01-14T22:24:35.643 に答える
0

複数のファイルでSSQLSを使用していると思います。複数のファイルでSSQLSを使用する方法について説明しましたか。

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

于 2012-01-14T22:12:47.163 に答える
0

2つの可能性があります-2つのリストタイプは互換性があるか、そうでないかのどちらかです。互換性がある場合は、定義を新しいヘッダーにコピーして、各場所からその定義を含めることができます。互換性がない場合は、名前の1つを変更する必要があります。

編集:これは私がいくつかのグーグル検索をすることによって見つけた2つの構造定義です:

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トリックを使用して、名前の1つを変更します。後者のルートを選択した場合でも、間違いを犯さないように注意してください。

于 2012-01-14T22:13:45.170 に答える