En el estándar C11 está escrito que los comstackdores deben proporcionar algunas macros para probar la presencia de características opcionales. ¿En qué encabezados los encuentro?
Por ejemplo, ¿dónde está ubicado __STDC_NO_VLA__
?
Con GCC, es decir, si bash encontrar __STDC_NO_COMPLEX__
en __STDC_NO_COMPLEX__
no lo encuentro allí …
No están definidos en ningún encabezado, un comstackdor los definirá ellos mismos.
Puedes volcar todas las definiciones del preprocesador. Por ejemplo para gcc write:
gcc -dM -E - < /dev/null
Por ejemplo para mí:
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
En el ejemplo que dio, __STDC_NO_VLA__
, la presencia de esto significa que el comstackdor no admite matrices de longitud variable. Podrías escribir:
#ifdef __STDC_NO_VLA__ #error Your compiler does not support VLAs! Please use a supported compiler. #endif
O
#ifndef __STDC_NO_VLA__ // code using variable length arrays #else // fallback code for when they are not supported #endif
Si se define STDC_NO_COMPLEX , indica que no hay ningún complejo.h
STDC_NO_COMPLEX está definido por el comstackdor, no por el archivo de encabezado