Ошибка компиляции: переопределение имени объединения

У меня есть этот кусок кода здесь, и я получаю ошибку 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
};

Эта программа о связи с мьютексами. Я не думаю, что речь идет о других частях программы, потому что ошибка появляется здесь, прямо в первой строке, и этот код находится вне основного, в начале программы, поэтому до этого нет никакого другого объявления объединения. (и после). Спасибо

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

Если у вас есть система мета-make для вашего пакета (configure, CMake и т. Д.), Вы можете проверить наличие union semun на этапе настройки, а не полагаться на проверки платформы.

Другие вопросы по тегам