1.4.1b Macros, valores y tipos estándar
§1 Sinopsis
Tanto el lenguaje en sí mismo como la Librería Estándar, a la que nos referimos más detenidamente en el Capítulo 5
(
5) y que en la práctica forma parte inseparable del
lenguaje, introducen una serie de macros, valores y tipos para uso propio.
§2 Macros
Son constantes simbólicas que son cambiadas a determinados
valores mediante una macro-sustitución durante la compilación. Sus
definiciones están incluídas en ficheros de cabecera. Por ejemplo, el fichero de cabecera <stdlib.h>,
de Borland C++ nos indica que la constante EXIT_FAILURE
es
sustituida por el valor 1 en la fase de preprocesado; a su vez el
fichero <stdio.h> informa que la etiqueta stderr
será sustituida por un miembro de una matriz: _streams
, que tiene un sentido concreto para este
compilador [1].
Las macros introducidas por el Estándar C++ son las siguientes:
assert
HUGE_VAL NULL <cstring>
SIGILL va_arg BUFSIZ LC_ALL NULL <ctime> SIGINT va_end CLOCKS_PER_SEC LC_COLLATE NULL <cwchar> SIGSEGV va_start EDOM LC_CTYPE offsetof SIGTERM WCHAR_MAX EOF LC_MONETARY RAND_MAX SIG_DFL WCHAR_MIN ERANGE LC_NUMERIC SEEK_CUR SIG_ERR WEOF <cwchar> errno LC_TIME SEEK_END SIG_IGN WEOF <cwctype> EXIT_FAILURE L_tmpnam SEEK_SET stderr _IOFBF EXIT_SUCCESS MB_CUR_MAX setjmp stdin _IOLBF FILENAME_MAX NULL <cstddef> SIGABRT stdout _IONBF FOPEN_MAX NULL <cstdio> SIGFPE TMP_MAX |
Nota: Las expresiones entre ángulos, como <cstdio>, indican que la definición se encuentra en más de un fichero de cabecera.
§3 Valores estándar
Al igual que los anteriores, los valores estándar son constantes simbólicas cuyo valor es cambiado durante el
preprocesado. Se refieren a valores de contorno (máximos y mínimos) definidos en la implementación. Algunos de
ellos son detallados en el capítulo dedicado a la representación y rango de los tipos numéricos
( 2.2.4).
Por ejemplo, la constante
ULONG_MAX
se refiere al valor máximo que puede albergar un tipo
unsigned long. El fichero <_lim.h> de Borland C++ señala su valor con un define:
#define ULONG_MAX 4294967295UL /* maximum unsigned long value */
Los valores est'andar definidos en el referido compilador son los siguientes:
CHAR_BIT
FLT_DIG INT_MIN
MB_LEN_MAX CHAR_MAX FLT_EPSILON LDBL_DIG SCHAR_MAX CHAR_MIN FLT_MANT_DIG LDBL_EPSILON SCHAR_MIN DBL_DIG FLT_MAX LDBL_MANT_DIG SHRT_MAX DBL_EPSILON FLT_MAX_10_EXP LDBL_MAX SHRT_MIN DBL_MANT_DIG FLT_MAX_EXP LDBL_MAX_10_EXP UCHAR_MAX DBL_MAX FLT_MIN LDBL_MAX_EXP UINT_MAX DBL_MAX_10_EXP FLT_MIN_10_EXP LDBL_MIN ULONG_MAX DBL_MAX_EXP FLT_MIN_EXP LDBL_MIN_10_EXP USHRT_MAX DBL_MIN FLT_RADIX LDBL_MIN_EXP DBL_MIN_10_EXP FLT_ROUNDS LONG_MAX DBL_MIN_EXP INT_MAX LONG_MIN |
§4 Tipos estándar
Son estructuras y clases definidas en ficheros de cabecera y utilizadas por la Librería Estándar.
clock_t
ldiv_t
size_t <cstdio> va_list div_t lconv mbstate_t wctrans_t wctype_t FILE ptrdiff_t size_t <ctime> size_t <cstring> fpos_t sig_atomic_t time_t wint_t <cwchar> jmp_buf size_t <cstddef> tm wint_t <cwctype> |
Nota: Las expresiones entre ángulos, como <cstdio>, indican que la definición se encuentra en más de un fichero de cabecera.
Ejemplo: el fichero <stdio.h> de Borland C++, nos informa
que FILE
es una estructura con la siguiente definición:
typedef struct {
unsigned char *curp; /* Current active pointer */
unsigned char *buffer; /* Data transfer buffer */
int level;
/* fill/empty level of buffer */
int bsize;
/* Buffer size */
unsigned short istemp; /* Temporary file indicator */
unsigned short flags; /* File status flags */
wchar_t hold;
/* Ungetc char if no buffer */
char fd;
/* File descriptor */
unsigned char token; /* Used for validity checking */
} FILE;
/* This is the FILE object */
§5 Otros valores
Muchos ficheros de cabecera definen constantes especialmente útiles, y conocer su existencia puede ser de gran ayuda en determinados momentos. A continuación se relacionan algunas de las definidas en Borland C++ con indicación del fichero en que están definidas.
Constante | Fichero | Valor |
BITSPERBYTE | values.h | Número de bits en un Byte |
EDOM |
errno.h math.h |
Código de error matemático |
EOF | stdio.h | Valor numérico indicación de que se ha alcanzado el fin de fichero |
ERANGE |
errno.h math.h |
Código de error por resultado fuera de rango |
FOPEN_MAX | stdio.h | Máximo número de ficheros por proceso (ver SYS_OPEN) |
HANLE_MAX | io.h | Máximo número de manejadores ("Handles") |
L_tmpnam | stdio.h | Tamaño de una matriz de caracteres suficiente para contener el nombre de un fichero temporal (nombre creado automáticamente por el sistema) |
M_E | math.h | Valor de e (Constante de Euler) con doce cifras significativas |
M_LOG2E | math.h | Valor del logaritmo decimal de e. log(e) |
M_LOG10E | math.h | Valor de log10(e) |
M_LN2 | math.h | Valor del logaritmo Nerperiano (base e) de 2. ln(2) |
N_LN10 | math.h | Valor de ln(10) |
M_PI | math.h | Valor de la constante pi (π) |
M_PI_2 | math.h | Valor π/2 |
M_PI_4 | math.h | Valor π/4 |
M_1_PI | math.h | Valor 1/π |
M_2_PI | math.h | Valor 2/π |
M_1_SQRTPI | math.h | Unidad dividida por raíz cuadrada de π. 1/SQR(π) |
M_2_SQRTPI | math.h | Valor 2/SQRT(π) |
M_SQRT2 | math.h | Raíz cuadrada de 2. SQRT(2) |
M_SQRT_2 | math.h | Raíz cuadrada de 2 dividida por 2. SQRT(2)/2 |
RAND_MAX | stdlib.h | Valor máximo devuelto por la función rand() (generador de números aleatorios) |
SYS_OPEN | stdio.h | Máximo número de ficheros por sistema (ver FOPEN_MAX) |
TMP_MAX | stdio.h | Máximo número de ficheros con nombre único (generados por el Sistema) |
UGE_VAL | math.h | Valor de fuera de rango superior ("Overflow") para operaciones matemáticas. |
[1] En concreto, el tercer miembro de la referida matriz. La sentencia exacta es
#define stderr (&std::_streams[2])