Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to include C11 headers when compiling C++ with GCC?

Tags:

c++

gcc

c11

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?

like image 348
Xiao Avatar asked Jul 27 '17 06:07

Xiao


1 Answers

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++.

like image 145
Jens Gustedt Avatar answered Sep 29 '22 15:09

Jens Gustedt