2017-07-27 3 views
0

Dans un projet C++, j'utilise une bibliothèque C qui inclut des en-têtes C11. Il ne compilera pas avec GCC. Voir ce code simple:Comment inclure les en-têtes C11 lors de la compilation de C++ avec GCC?

// main.cc 
#include <stdatomic.h> 

int main() 
{ 
    return 0; 
} 

Courir gcc main.cc -lstdc++, il se plaint: error: ‘_Atomic’ does not name a type. Cependant, clang main.cc -lstdc++ fonctionne comme un charme. Je me demande ce qui fait la différence, et comment puis-je le compiler avec gcc?

+5

Cette bibliothèque ne peut pas être utilisée telle quelle en C++. Différentes langues maintenant plus que jamais. Vous auriez besoin de l'envelopper. – StoryTeller

+0

Il existe des différences de syntaxe entre les langues. Quand C dit '_Atomic int' C++ utilise des templates et dit' atomic '. –

+0

@StoryTeller Un guide sur la façon de l'emballer? – Xiao

Répondre

4

Pour conclure en-têtes C qui utilisent Atomics, vous pouvez utiliser l'autre orthographe _Atomic et définir une macro qui transforme cela valide C++:

#ifndef __cplusplus 
# include <stdatomic.h> 
#else 
# include <atomic> 
# define _Atomic(X) std::atomic<X> 
#endif 

int foo(_Atomic(unsigned)* toto); 

Les deux interfaces Atomics ont été développés en synchronisation entre les deux comités , donc en plus des problèmes de syntaxe, ceux-ci devraient être compatibles avec les binaires sur toute plate-forme raisonnable qui fournit C et C++.