【问题标题】:Avoiding conflicting declaration errors in typedef c++避免 typedef c++ 中的冲突声明错误
【发布时间】:2012-01-14 22:09:37
【问题描述】:

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

背景:

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

编译

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

问题:

gridlab 中的 mysql.h 和 list.h 都将 typedef 结构命名为 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'

感谢您的帮助!

【问题讨论】:

  • 你不能把#ifndef 放在其中一个定义周围吗?
  • 也许你可以创建自己的可以独立编译的抽象,这样两个 typedef 就不会出现在同一个编译单元中。

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


【解决方案1】:

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

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

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

【讨论】:

  • @VikasYendluri - 它基本上导致预处理器在出现LIST 的每个地方用GRIDLAB_LIST 进行简单的文本替换LIST。由于LIST 是一个typedef,因此(即使使用C++)在生成的目标文件中也没有机会提及该名称。它不会导致编译或链接问题。
  • 除非有代码需要同时使用这两种列表类型,否则这是一个好的开始。实际上 - 即使那样,只要您在共享代码的正确位置使用 GRIDLAB_LIST 就可以了。
  • @CarlNorum - 我就是这么想的。
【解决方案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”之类的东西。恕我直言...

【讨论】:

  • 这也是一个想法,而且比我的想法干净得多。 :-)
  • 如果我要这样做,我需要在 dbaccess.h 中包含 mysql++.h。那么我需要在 main.cpp 中包含 dbaccess.h。由于 main.cpp 还将包含 gridlab.h 标头,因此我仍然会面临相同的冲突声明错误。我该如何解决这个问题?
  • 不,不要在 dbaccess.h 中包含 mysql++.h,只在 dbaccess.cpp 中。关键是围绕原始 MySQL 访问定义您自己的私有抽象。 (无论如何,您的大部分代码都不应该耦合到特定的数据库!)
【解决方案3】:

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

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

【讨论】:

  • 感谢您的回复。事实证明,我没有在多个文件中使用 SSQLS。您链接到的部分是指为 mysql++ 定义自定义 SSQLS 模式,我的错误来自整个库,而我没有自定义 SSQL。
【解决方案4】:

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

编辑:这是我通过谷歌搜索找到的两个结构定义:

MySQL:

typedef struct st_list {
  struct st_list *prev,*next;
  void *data;
} LIST;

网格实验室:

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 技巧 - 请注意,如果您选择后者,请注意不要犯任何错误。

【讨论】:

  • @VikasYendluri - Omnifarious 的回答就是一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
相关资源
最近更新 更多