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()
{
printf("Hello world\n");
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?
clang
clang main.cc -lstdc++
编译正常,生成a.out, 运行a.out,打印出“Hello world”
gcc
gcc main.cc -lstdc++
编译出错:
That library can’t be used as is in C++. Different languages now more than ever. You’d need to wrap it.
这是因为stdatomic.h是c11引入的,该库不能按原样在 C++ 中使用。你需要把它包起来。
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++.