簡體   English   中英

避免在typedef c ++中出現沖突的聲明錯誤

[英]Avoiding conflicting declaration errors in typedef c++

有沒有辦法讓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'

謝謝你的幫助!

也許預處理器包含您的問題的解決方案。

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

當然,這依賴於gridlab而不是#include任何來自MySQL的東西。

最佳方案:

1)保留當前的主程序

   EXAMPLE: "main.cpp"

2)為數據庫訪問編寫一個模塊

   EXAMPLE: dbaccess.cpp, dbaccess.h

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

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

問題解決了 :)?

PS:如果你真的需要某種可以在不同模塊之間共享的“列表”,我建議你使用像標准C ++“vector <>”這樣的東西。 恕我直言...

我假設你在多個文件中使用SSQLS。 您是否已閱讀有關在多個文件中使用SSQLS的說明。

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

有兩種可能性 - 兩種列表類型兼容,或者它們不兼容。 如果它們兼容,您只需將定義復制到新標題中,並在每個位置包含該標題。 如果它們不兼容,您將不得不更改其中一個名稱。

編輯:以下是我通過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技巧 - 注意如果選擇后一個路線,你不會犯任何錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM