Gcc 编译错误:重新定义联合名称

Gcc 编译错误:重新定义联合名称,gcc,compiler-errors,posix,mutex,unions,Gcc,Compiler Errors,Posix,Mutex,Unions,我这里有一段代码,我得到了一个GCC错误:在代码的开头重新定义了union 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 semin

我这里有一段代码,我得到了一个GCC错误:在代码的开头重新定义了union 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
};

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

与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
#if(已定义(uu GNU_ulibrary_uu))和&!已定义(_semusemun_UNDEFINED))\
||定义(uuu FreeBSD_uuuu)| |。。。
/*union semun的定义包括*/
#否则
联合塞蒙{
// ...
};
#恩迪夫

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

好的,非常感谢!看来这个联盟已经被包括在内了。谢谢你的快速提示!我还与LinuxMint合作开发了这个程序,而union没有包含在sys/sem.h中。现在是FreeBSD。因此,最好的方法是将ifs放在开头。@STRATOSpeed是的,如果定义了(u FreeBSD_uu)等,您可能想使用
。因为您相信ecatmur对您的问题的回答是正确的,您可以通过以下方式帮助So社区。然后它就不会一直显示为未回答。此外,如果您这样做,ecatmur将获得一些声誉积分,您也会获得。