Où sont les macros de fonctions optionnelles C11?

Dans la norme C11, il est écrit que les compilateurs doivent fournir des macros pour tester la présence de fonctions facultatives. Dans quels en-têtes je les trouve?

Par exemple, où est situé __STDC_NO_VLA__ ?

Avec GCC, c’est-à-dire que si j’essaie de trouver __STDC_NO_COMPLEX__ dans __STDC_NO_COMPLEX__ je ne le trouve pas là …

Ils ne sont définis dans aucun en-tête, un compilateur les définira lui-même.

Vous pouvez vider toutes les définitions du préprocesseur. Par exemple pour gcc, écrivez:

 gcc -dM -E - < /dev/null 

Par exemple pour moi:

 bob@bob-fedora:~/trunk/software$ gcc --version gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. bob@bob-fedora:~/trunk/software$ gcc -std=gnu11 -dM -E - < /dev/null | grep STDC #define __STDC_HOSTED__ 1 #define __STDC_UTF_16__ 1 #define __STDC_VERSION__ 201112L #define __GNUC_STDC_INLINE__ 1 #define __STDC_UTF_32__ 1 #define __STDC__ 1 

Dans l'exemple que vous avez donné, __STDC_NO_VLA__ la présence de cela signifie que le compilateur ne prend pas en charge les tableaux de longueur variable. Vous pouvez écrire:

 #ifdef __STDC_NO_VLA__ #error Your comstackr does not support VLAs! Please use a supported comstackr. #endif 

Ou

 #ifndef __STDC_NO_VLA__ // code using variable length arrays #else // fallback code for when they are not supported #endif 

si STDC_NO_COMPLEX est défini, cela signifie qu’il n’y a pas de complex.h

STDC_NO_COMPLEX est défini par le compilateur, pas par le fichier d’en-tête.

source: http://en.cppreference.com/w/c/numeric/complex