preprocesamiento - strlen en el preprocesador C?
funcion preprocesador en c++ (4)
En general, el preprocesador C no transforma ningún dato, solo lo reemplaza. Esto significa que puede realizar dicha operación siempre que contamine el espacio de nombres del preprocesador C con estructuras de datos persistentes (funcionales) de implementación de datos.
Dicho esto, realmente no quieres hacer esto, ya que toda la funcionalidad "agregada" fallará de manera espectacular una vez que pases algo que no sea una cadena. El preprocesador C no tiene un concepto de tipo de datos, ni tiene el concepto de desreferenciación de la memoria (útil si deseaba la longitud de una cadena almacenada en una variable). Básicamente, sería un ejercicio divertido "mira hasta dónde puedes llegar", pero al final, tendrías un MYSTRING_LEN que solo te llevaría una corta distancia hasta la meta.
Además, la falta de espacios de nombre del preprocesador C significa que tal sistema de expansión de macros no sería posible. Uno debería tener cuidado de evitar que los nombres generados interfieran con otras macros útiles. Al final, probablemente se quedará sin memoria en el preprocesador para un uso significativo, ya que el preprocesador no está realmente construido para contener un nombre para cada carácter que se convierte en el token de "unidad", y un nombre por cada token de "unidad" comprimido en su notación decimal final.
¿Es posible implementar strlen()
en el preprocesador de C ?
Dado:
#define MYSTRING "bob"
¿Hay alguna macro preprocesadora, X
, que me permita decir:
#define MYSTRING_LEN X(MYSTRING)
No utiliza el preprocesador, pero sizeof se resuelve en el momento de la compilación. Si su cadena está en una matriz, puede usarla para determinar su longitud en el momento de la compilación:
static const char string[] = "bob";
#define STRLEN(s) (sizeof(s)/sizeof(s[0]))
Tenga en cuenta el hecho de que STRLEN
anterior incluirá el terminador nulo, a diferencia de strlen()
.
Sí: #define MYSTRING_LEN(s) strlen(s)
En la mayoría de los compiladores, esto producirá una constante de tiempo de compilación para un argumento constante ... y no se puede hacer mejor que eso.
En otras palabras: no necesitas una macro, solo usa strlen; El compilador es lo suficientemente inteligente como para hacer el trabajo por ti.
Tu puedes hacer:
#define MYSTRING sizeof("bob")
Eso dice 4 en mi máquina, debido a la nula agregada al final.
Por supuesto, esto solo funciona para una constante de cadena.
Usando MSVC 16 ( cl.exe -Wall /TC file.c
) esto:
#include "stdio.h"
#define LEN_CONST(x) sizeof(x)
int main(void)
{
printf("Size: %d/n", LEN_CONST("Hej mannen"));
return 0;
}
salidas:
Size: 11
El tamaño de la cadena más el carácter NUL.