2010-01-30 6 views
3

Je portais récemment un projet de GCC à clang (dans lequel j'ai corrigé un certain nombre de C GNU-isms). Cela m'a fait réfléchir: quels C GNU-isms (extensions au langage C supporté dans GCC, qui ne sont pas standardisés) existent? Y a-t-il une liste complète partout?Qu'est-ce que C GNU-isms existe?

Répondre

8

Voici une liste assez complète provenant du site Web de GCC. Il semble y avoir beaucoup, donc je vous souhaite la meilleure des chances de passer au crible!

http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/C-Extensions.html

+1

Je vois que vous avez résisté en suggérant RTFM ;-) – Clifford

+0

Il est à noter que beaucoup de ces extensions font partie de C99. Ce ne sont que des extensions GNU en ce que GCC vous permet de les utiliser en mode C89. Par exemple: https://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/Compound-Literals.html#Compound-Literals – Brendan

0

Bien qu'il existe de nombreuses extensions, et je suspends à la réponse de Beta pour cela, il est peu probable que votre projet repose sur un grand nombre d'entre eux. Il est possible de désactiver les extensions dans une compilation GNU, donc cela vous avertira à l'avance de toute incompatibilité potentielle dans votre base de code.

Vous pouvez rencontrer d'autres problèmes tels que le fait que GCC supporte la plupart des fonctionnalités C99, contrairement à certains compilateurs populaires (Microsoft VC++ spécifiquement). Vous pouvez donc également désactiver les fonctionnalités C99 lorsque vous testez la base de code.

+0

En fait, sur les systèmes (non intégrés) autres que Windows, la plupart des compilateurs soutenir la plupart des fonctionnalités C99. Il s'agit d'un sujet de controverse sur le groupe de discussion comp.std.c, vous pouvez également consulter groups.google.com pour plus d'informations. –

+0

@Jonathan: C'est peut-être parce que sur les systèmes non-Windows tels que OSX et Linux, le compilateur standard * de facto est * GCC. Je suis en fait un développeur de systèmes embarqués, et la prise en charge de nombreuses fonctionnalités C99 (en particulier les fonctionnalités gratuites comme les nouveaux en-têtes) n'est pas rare. En fait, puisque GCC est également répandu dans les systèmes embarqués, il est très commun. – Clifford

+0

Même les compilateurs non-GCC supportent la plupart des C99 sur la plupart des systèmes de classe serveur (évitant soigneusement l'espace incorporé, où les règles peuvent être différentes et où je n'ai pas un bon aperçu des pratiques actuelles - et 25+ expérience d'un an est essentiellement sans aide ces jours-ci). –

0

L'un des plus beaux GNUIS que j'ai trouvés était une déclaration de clé explicite lors du remplissage de structures.

struct canmsg_t { 
     short  flags; 
     int  cob; 
     canmsg_id_t id; 
     unsigned long timestamp; 
     unsigned int length; 
     unsigned char data[CAN_MSG_LENGTH]; 
}; 

canmsg_t msg = 
{ 
     ["flags"] = 0x00; 
     ["cob"] = 0; 
     ["id"] = 0x534; 
     ["timestamp"] = 0; 
     ["length"] = 1; 
     ["data"] = { 0 }; 
} 

Cela ne permet pas d'ignorer les membres ou les réordonner, juste renvoie une erreur si vous le faites, mais avec plus de 100 structures d'éléments cela devient une valeur inestimable.

+2

Lors de la compilation du code C, GCC prend désormais en charge les initialiseurs nommés C99, ce qui * vous * permet d'ignorer et de réorganiser les membres: 'struct canmsg_t msg = {.flags = 0x00; .length = 1; .id = 0x534; }; ' – caf

+0

Il serait bon de savoir ce que Mike portait * à *, car cela ne supporte pas non plus C99 (MSVC++ par exemple). – Clifford