Consideremos el siguiente código:C++ identificador de llamada de función
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
LOG_ERROR()
es una macro. LOG_ERROR()
debe imprimir una cadena que lo identifique en el código, mientras que la suposición es que el código puede cambiar, pero A::Foo()
se mantendrá sin cambios. El identificador debe retener mientras cambia el código .
Esto se puede resolver mediante la adición de código de error como argumento para LOG_ERROR()
, pero queremos eliminar del programador de la carga de gestionar el error códigos.
Usar __LINE__
no es una respuesta, ya que Foo()
puede pasar de la compilación a la compilación .
Por lo tanto pensé en la identificación de LOG_ERROR()
relativo al inicio de Foo()
:
- a. Identifique por nombre de archivo (
__FILE__
) + nombre de función (__FUNCTION__
) + número de línea deLOG_ERROR()
relativo aFoo()
inicio. - b. Identificar por nombre de archivo (
__FILE__
) + nombre de función (__FUNCTION__
) +LOG_ERROR()
número de llamada enFoo()
.
La solución debería funcionar con VC++ 2008 y g ++ 4.1.1 al menos.
Una solución propuesta (link text) es:
#define ENABLE_LOG_ERROR static const int LOG_ERROR_start_line = __LINE__
#define LOG_ERROR(s) cerr << "error #" << (__LINE__ - LOG_ERROR_start_line) \
<< " in " << __func__ << ": " << s << endl
void Foo() {
ENABLE_LOG_ERROR;
//...
LOG_ERROR("error 1");
int i;
LOG_ERROR("error 2");
}
Esto obligará a los usuarios a escribir en ENABLE_LOG_ERROR
inicio de cada función que contiene LOG_ERROR()
y hay muchas de esas funciones.
¿Hay alguna otra forma de realizar la tarea?
@idimba, si no es demasiado problema, puede usar una secuencia de comandos para agregar automáticamente 'ENABLE_LOG_ERROR;' justo después de cada nombre de función. Utilizo ese truco cuando exploro * código de terceros. –
Buena idea, pero influirá en __LINE__ que utilizamos extensamente en nuestro subsistema de registro. – dimba