En C, no se puede determinar con fiabilidad el tipo de un objeto. Por lo tanto, tendrías que introducir algún mecanismo para admitir la programación genérica, p. adjuntando todos los objetos en una estructura que mantiene la información del tipo:
enum {type_int, type_double, type_string, /* ... */ } type_t;
struct {
type_t type;
void *obj;
} generic_type;
Ahora, puede cambiar durante ((generic_type)my_object).type
. Esto probablemente no es lo que estás buscando.
Sin embargo, hay un truco fácil de decir si un argumento macro es una cadena literal o alguna otra cosa. Con el carácter citando macro '#', puede activar un argumento macro en una cadena:
#define DEBUG(x) if (#x[0] == '"') printf("%s\n", x); else printf("%d\n", x)
Ahora usted puede hacer lo siguiente:
DEBUG("foo bar"); // prints "foo bar"
DEBUG(23); // prints "23"
En el lado negativo, esto no le fallará distinguir entre, por ejemplo int
sy float
s.Por otra parte, los punteros-a-char no se reconocen como cadenas:
char *foo = "bar";
DEBUG(foo); // prints the value of foo, not the string pointed to by foo
double salary;
DEBUG(salary); // prints (int)salary, not (double)salary
En algunas máquinas, sizeof(double) != sizeof(int)
. Esto podría ayudar a distinguir aún más entre los diferentes tipos de argumentos de macro, pero ciertamente no es portátil.
En términos generales, usted no será capaz de resolver completamente este problema sin algún esfuerzo serio hacia el soporte de programación genérica al mismo tiempo mantener la portabilidad.
Mi consejo: simplemente acostúmbrate a formatear los especificadores.
¿Seguro que quieres utilizar 'endl'? Provoca un flujo de la corriente que realmente ralentizará el programa. –
Como nota al margen, la práctica estándar al escribir cualquier forma de macro como función es poner paréntesis alrededor de toda la expresión. – Lundin
@mattieu: sí, quiere usar 'endl': en depuración está bien para ralentizar el programa. Y: desea ver cada línea en la consola, mientras el programa la ejecuta. No ruborizarse significaría: no * ve * lo que acaba de imprimir, a veces. Eso dificulta la depuración. – towi