В проекте C ++ я использую библиотеку C, которая включает несколько заголовков C11. Это не скомпилируется с GCC. Посмотрите этот простой код:
// main.cc
#include <stdatomic.h>
int main()
{
return 0;
}
Бег gcc main.cc -lstdc++
жалуется: error: ‘_Atomic’ does not name a type
, Тем не мение, clang main.cc -lstdc++
работает как шарм.
Мне интересно, что имеет значение, и как я могу скомпилировать его с помощью gcc?
Чтобы обернуть заголовки C, которые используют атомику, вы можете использовать другое написание _Atomic
и определите макрос, который преобразует это в действительный C ++:
#ifndef __cplusplus
# include <stdatomic.h>
#else
# include <atomic>
# define _Atomic(X) std::atomic< X >
#endif
int foo(_Atomic(unsigned)* toto);
Оба атомных интерфейса были разработаны синхронно между двумя комитетами, поэтому помимо синтаксических проблем они должны быть двоично-совместимыми на любой разумной платформе, которая предоставляет C и C ++.
Других решений пока нет …