【问题标题】:Compilation error: Redefinition of union name编译错误:重新定义联合名称
【发布时间】:2014-05-16 13:09:22
【问题描述】:

我在这里有这段代码,我得到一个 GCC 错误:在这段代码的开头重新定义联合 semun

union semun {
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
};

这个程序是关于与互斥体通信的。我不认为这与程序的其他部分有关,因为错误出现在这里,就在它的第一行,而且这段代码在主程序之外,在程序的开头,所以之前没有任何其他联合声明(之后)。谢谢

【问题讨论】:

  • 既然您认为 ecatmur 对您的问题的回答是正确的,您可以通过 marking it accepted 帮助 SO 社区。然后它不会一直显示为未答复。此外,如果您这样做,ecatmur 将获得一些声望点,您也将获得。

标签: gcc compiler-errors posix mutex unions


【解决方案1】:

与 X/Open 不同,某些平台在其标头中定义了 union semun(特别是在 sys/sem.h 中)。

您可以使用适当的平台标识符宏进行相应检查:

#if (defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)) \
    || defined(__FreeBSD__) || ...
/* union semun is defined by including <sys/sem.h> */
#else
union semun {
    // ...
};
#endif

如果您的包(配置、CMake 等)有元制作系统,您可以在配置阶段检查union semun 的存在,而不是依赖平台检查。

【讨论】:

  • 好的,非常感谢!这个联合似乎已经包含在 中。感谢您的快速提示!
  • 我也在 Linux Mint 中使用过这个程序,并且联合体没有包含在 sys/sem.h 中。现在在 FreeBSD 上它是。所以最好的办法就是把 if 放在开头。
  • @STRATOSpeed 是的,您可能想使用#if defined (__FreeBSD__) 等。
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2015-06-30
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多