Cosas de C

The site directory migrate module is currently enabled, unless you are doing the migration right now, there's no reason to leave it enabled.

Hace un par de años, cansado de llenar mis practicas de printf's, decidi hacerme una libreria dinamica que me ayudara a trazar los valores de distintos tipos base con una sola linea.
La verdad es que me pase un buen rato escribiendola y hoy en clase han tirado a la basura mucho de ese trabajo con una simple macro. He aqui un ejemplo:

#define traza(t,x) printf(#x"="t" Linea=%d\n",x,__LINE__);

int main(){
        int a=2;
        traza("%d",a);
}

Y el resultado es:

$ ./macro 
a=2 Linea=7

Mi libreria incluia mas funcionalidades pero la verdad es que esto me ha dejado roto :).
En fin...por lo menos algo he aprendido.

Recoleccion de macros

Estoy recogiendo en mi repositorio Subversion todas estas macros que se han ido posteando.
Si teneis mas macros interesantes que querais incluir o veis que me he dejado algo importante hacedmelo saber

Saludos :)

Más y más cosas de C

Algo bastante útil para poder usar colores en tus programas es:

#define rojo(x) printf("\033[0;31m%s\033[0m", x)
#define verde(x) printf("\033[0;32m%s\033[0m", x)

Y luego metes:

  rojo("texto rojo");
  verde("texto verde");

.. el resultado os lo podeis imaginar :)

En varios tonos :)

Con unas macros tipo:

#define blue(string)            "\x1b[34;01m"string"\x1b[39;49;00m"
#define red(string)             "\x1b[31;01m"string"\x1b[39;49;00m"
#define green(string)           "\x1b[32;01m"string"\x1b[39;49;00m"
#define yellow(string)          "\x1b[33;01m"string"\x1b[39;49;00m"
#define darkblue(string)        "\x1b[34m"string"\x1b[39;49;00m"
#define darkred(string)         "\x1b[31m"string"\x1b[39;49;00m"
#define darkgreen(string)       "\x1b[32m"string"\x1b[39;49;00m"
#define darkyellow(string)      "\x1b[32m"string"\x1b[39;49;00m"

Puedes meter varios colores en una frase, por ejemplo:

#include "colores.h"

int main(){
        printf(blue("hola")red(" mundo\n"));
}

Más cosas de C

Ese tipo de macros, son muy buenas para crear macros de trazas o logs, yo también las descubrí hace poco y la versión que puedo aportar es esta:

#define traza(t,x) printf(#x"="t" Linea=%d funcion=%s fichero=%s\n",x,__LINE__,__FUNCTION__,__FILE__);

int main(){
   int a=2;
   traza("%d",a);
}

Que nos da como resultado:

a=2 Linea=5 funcion=main fichero=pru.c

Bastante útil si el proyecto es grande y trabajamos con varias/os funciones/ficheros.

Por otro lado, algo que me sorprendio hace poco es el hecho de que una macro pudiera aceptar una lista de argumentos variable de la forma:

#define funcion(a, b, args...)   otra(a, __FILE__,  __LIN
E__,  __FUNCTION__, b, ## args)

De esta forma, por ejemplo, b podría ser un format string y en args se encontraria la lista de sustituciones.