2012-01-16 16 views
9

Quiero crear un archivo log.c que contenga las funciones info(), debug() y error(). Estas funciones funcionan sin imprimir el nombre del archivo, el número de línea, etc. Así que cuando llamo a una de esta función deseo volcar el nombre del archivo, el número de línea y el nombre de la función de la persona que llama. Entonces, ¿cómo podemos rastrear exactamente? ¿Hay alguna manera de rastrear en C o, si usamos macros, cómo se puede hacer esto?Imprima el nombre del archivo, el número de línea y el nombre de función de una función de llamada - Prog C

+0

http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm

+1

posible duplicado de [C/C++ número de línea] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116

+0

@KennyTM: ¡Gracias! La respuesta está ahí. – sura2k

Respuesta

21

me lo pase los datos a la función a través de los parámetros (tal vez obtener la ayuda de una macro)

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 

Y llamarlos

info(__FILE__, __LINE__, __func__, ...); 
debug(__FILE__, __LINE__, __func__, ...); 
error(__FILE__, __LINE__, __func__, ...); 

Nota: es __func__ C99; gcc, en modo C89 tiene __FUNCTION__

+0

¿Hay alguna forma de crear este tipo de funciones, sin pasar parámetros __FILE __, .. etc todo el tiempo? – sura2k

+8

Sí, con una macro. Por ejemplo, para C99 (que tiene macros variadas): '#define INFO (...) información (__ FILE__, __LINE__, __VAÚN___AGGS__)' – pmg

+0

¡Gracias! Eso es lo que necesitaba. – sura2k

5

Si utiliza macros, creo que puede hacer que esto funcione usando __FILE__, __LINE__ y __FUNCTION__. Por ejemplo,

#define INFO(msg) \ 
    fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \ 
    fprintf(stderr, "%s", msg); 

Usted podría utilizar funciones también, pero que tendría que pasar en __FILE__, etc., para asegurarse de que tenían el valor correcto.

+1

'gcc -std = gnu99' dice' __LINE__' es un número entero y advierte sobre la conversión a 'char *'. ¿No debería ser la segunda línea 'fprintf (stderr," info:% s:% d: ", __FILE__, __LINE__); \ '('% s' reemplazado por '% d')? – matec

+0

¡Reparado! Se escapa un poco de la vieja escuela de Python allí. – Michael

Cuestiones relacionadas