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
Respuesta
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__
¿Hay alguna forma de crear este tipo de funciones, sin pasar parámetros __FILE __, .. etc todo el tiempo? – sura2k
Sí, con una macro. Por ejemplo, para C99 (que tiene macros variadas): '#define INFO (...) información (__ FILE__, __LINE__, __VAÚN___AGGS__)' – pmg
¡Gracias! Eso es lo que necesitaba. – sura2k
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.
'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
¡Reparado! Se escapa un poco de la vieja escuela de Python allí. – Michael
- 1. Imprima el nombre de la variable objetivo-C
- 2. C# imprima el nombre de la clase desde una función estática
- 3. Java: cómo obtener el nombre de la función de llamada
- 4. Obtener el nombre de una función decorada?
- 5. Registro de Python (nombre de la función, nombre de archivo, número de línea) utilizando un único archivo
- 6. obtienen llamadas nombre de la función de la función llamada
- 7. Cómo registrar el nombre del archivo fuente y el número de línea en Python
- 8. ¿Obtener el número de puerto para el nombre del servicio?
- 9. El espacio después del nombre de la función es incorrecto?
- 10. ¿Hay alguna manera de obtener el nombre de la función dentro de una función de C++?
- 11. extrayendo un nombre de llamada de función de una llamada a función
- 12. C++ identificador de llamada de función
- 13. jQuery función de llamada por su nombre
- 14. Grep list nombre de archivo y número de línea
- 15. ¿Cómo obtener el nombre del archivo de origen y el número de línea de un miembro de tipo?
- 16. ¿Hay alguna manera de obtener el nombre de la función de llamada dentro del destinatario?
- 17. ¿Cómo imprimir el nombre del método y el número de línea y deshabilitar condicionalmente NSLog?
- 18. ¿Cómo se determina el espacio de nombre de una función?
- 19. Extraer solo el nombre de archivo Del nombre de FileItem
- 20. Obtener el tipo MIME del nombre de archivo en C
- 21. ¿Cómo determinar el archivo, la función y el número de línea?
- 22. El significado de 'en el nombre de la función Haskell?
- 23. Cython: función de llamada desde el archivo C externo
- 24. Cómo encontrar el nombre completo del método de llamada C#
- 25. Cómo obtener el nombre de función de un puntero de función C
- 26. ¿Cómo puedo obtener el nombre de una función de llamada dentro de un módulo en Mathematica?
- 27. javascript - arguments.callee.toString() y arguments.callee.name no devuelve el nombre de función
- 28. Encontrar el nombre de la variable pasa a una función
- 29. ¿Cómo cambio el nombre de una función bash?
- 30. Imprimir el nombre de una función en println()?
http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm
posible duplicado de [C/C++ número de línea] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116
@KennyTM: ¡Gracias! La respuesta está ahí. – sura2k