texto separar para macro len funciones funcion con columnas cadenas c macros

len - macro para separar texto en columnas



entero al convertidor de cadenas(usando macros) (3)

Estaba haciendo lo básico de las macros. Defino una macro de la siguiente manera:

#define INTTOSTR(int) #int

para convertir un entero en una cadena.

¿Esta macro convierte perfectamente el número entero en cadena? Quiero decir, ¿hay algunas situaciones donde esta macro puede fallar?

¿Puedo usar esta macro para reemplazar funciones de biblioteca estándar como itoa() ?

por ejemplo:

int main() { int a=56; char ch[]=INTTOSTR(56); char ch1[10]; itoa(56,ch1,10); printf("%s %s",ch,ch1); return 0; }

El programa anterior funciona como se esperaba.

Curiosamente, esta macro incluso puede convertir el valor de float en la cadena.

por ejemplo:

INTTOSTR(53.5);

funciona bien

Hasta ahora estaba usando la función itoa para convertir int a cadena en todos mis proyectos. ¿Puedo reemplazarlo itoa confianza en todos los proyectos? Porque sé que hay menos sobrecarga en el uso de macro que llamada de función.


En C, puede usar itoa o, si está desesperado y le gustaría evitarlo, utilice snprintf, por ejemplo:

snprintf(my_str, sizeof(int), "%i", my_int);

El problema con su macro es que está pensando en constantes, pero, por supuesto, su macro se romperá cuando necesite usar una variable que contenga un entero. Su macro intentará escribir el nombre de la macro en lugar del valor que tendría.

Si está satisfecho con las constantes, su macro es "buena", de lo contrario, se activará.


Las macros se ejecutan durante (antes de ser exactas) el tiempo de compilación, por lo que puede convertir un número literal en su código fuente en una cadena, pero no un número almacenado en una variable

En su ejemplo, INTTOSTR(56) utiliza el operador de stringification del preprocesador que finalmente da como resultado "56" . Si lo llamó en una variable, obtendría el nombre de la variable pero no su contenido.


Su macro no convierte números enteros en cadenas, convierte un literal en un literal de cadena, que es algo muy diferente.

Los literales son cualquier número simple o definiciones de valores en su código. cuando haces int x = 10; el número 10 en un literal entero , mientras que x es una variable e int es el tipo. const char* ten = "10"; también define un literal, en este caso un literal de cadena , con el valor "10" y una variable llamada ten que apunta a la dirección donde se define este literal. Lo que su macro realmente hace es cambiar la forma en que se representa el literal antes de que continúe cualquier compilación real, desde un literal entero hasta un literal de cadena.

Por lo tanto, el cambio real se está realizando antes de cualquier compilación, solo en el nivel del código fuente. Las macros no son funciones y no pueden inspeccionar la memoria, y su conversión no funcionaría con variables. Si intentas:

int x = 10; const char* ten = INTTOSTR(x);

Te sorprendería saber que tu variable ten tendría el valor "x". Eso es porque x se trata como un literal, y no como una variable.

Si desea ver qué está sucediendo, le recomiendo pedirle a su compilador que se detenga en el preprocesamiento, y vea la salida antes de que su código sea compilado de forma efectiva. Puede hacer esto en GCC si pasa el indicador -E.

PD. Con respecto al aparente "éxito" con la conversión de los valores de flotación, solo viene a mostrar el peligro de las macros: no son seguras para el tipo. No mira 53.5 como un flotador, sino como un token representado por los caracteres 5, 3,. y 5 en el código fuente.