问题
In a C++ project, I'm using a C library which includes some C11 headers. It won't compile with GCC. See this simple code:
// main.cc
#include <stdatomic.h>
int main()
{
return 0;
}
Running gcc main.cc -lstdc++
, it complains: error: ‘_Atomic’ does not name a type
. However, clang main.cc -lstdc++
works like a charm.
I'm wondering what makes the difference, and how can I compile it with gcc?
回答1:
To wrap C headers that use atomics, you may use the other spelling of _Atomic
and define a macro that transforms this to valid C++:
#ifndef __cplusplus
# include <stdatomic.h>
#else
# include <atomic>
# define _Atomic(X) std::atomic< X >
#endif
int foo(_Atomic(unsigned)* toto);
Both atomics interfaces have been developed in sync between the two committees, so besides syntax problems these should be binary compatible on any reasonable platform that provides C and C++.
来源:https://stackoverflow.com/questions/45342776/how-to-include-c11-headers-when-compiling-c-with-gcc