c++ - ¿Cómo puedo usar#pragma message() para que el mensaje apunte al archivo(lineno)?
visual-studio-2010 line-numbers (5)
Acabo de lanzar esto ahora, y seguro que supera mi antigua solución de usar #error
: D
#define _STR(x) #x
#define STR(x) _STR(x)
#define TODO(x) __pragma(message("TODO: "_STR(x) " :: " __FILE__ "@" STR(__LINE__)))
Puede modificar esto como quiera / a lo que se adapte a sus necesidades. Un ejemplo de su uso:
//in code somewhere
TODO(Fix this);
Salida en el panel de la consola:
1>TODO: Fix this :: c:/users/administrator/documents/visual studio 2008/projects/metatest/metatest/metatest.cpp@33
el único inconveniente es que no puedes saltar a la línea de esto (haciendo doble clic en el mensaje en el panel de la consola) usando __pragma
(pero al probar con #pragma
no parece ser el caso de todos modos ...)
Para agregar elementos ''todo'' a mi código, quiero poner un mensaje en la salida del compilador.
Me gustaría que se vea así:
c:/temp/main.cpp(104): TODO - add code to implement this
para hacer uso de la funcionalidad de salida de compilación de Visual Studio para navegar a la línea respectiva haciendo doble clic en ella.
Pero la macro __LINE__
parece expandirse a un int
, lo que no permite la escritura
#pragma message( __FILE__ "("__LINE__"): ..." )
¿Habría otra manera?
Aquí hay uno que le permite hacer clic en el panel de salida:
(También hay algunos otros buenos consejos allí)
http://www.highprogrammer.com/alan/windev/visualstudio.html
// Statements like:
// #pragma message(Reminder "Fix this problem!")
// Which will cause messages like:
// C:/Source/Project/main.cpp(47): Reminder: Fix this problem!
// to show up during compiles. Note that you can NOT use the
// words "error" or "warning" in your reminders, since it will
// make the IDE think it should abort execution. You can double
// click on these messages and jump to the line in question.
#define Stringize( L ) #L
#define MakeString( M, L ) M(L)
#define $Line MakeString( Stringize, __LINE__ )
#define Reminder __FILE__ "(" $Line ") : Reminder: "
Una vez definido, usar como tal:
#pragma message(Reminder "Fix this problem!")
Esto creará una salida como:
C: / Source / Project / main.cpp (47): Recordatorio: ¡Solucione este problema!
Este es un addendum a la respuesta para aquellos que encuentran tedioso #pragma
directivas #pragma
cada vez que necesitan poner un marcador en el código: ¡Puede guardar algunas pulsaciones de teclas con una macro para hacer esto por usted! Mientras que en general, no puede tener una directiva #pragma
dentro de las macros, los compiladores de MS C / C ++ 2008 y superiores admiten una extensión especial específica del proveedor llamada __pragma
que se puede usar con las macros. Ver Directivas Pragma y la Palabra clave __Pragma .
Uso algo parecido a lo siguiente a diario:
#define STR2(x) #x
#define STR1(x) STR2(x)
#define LOC __FILE__ "("STR1(__LINE__)") : Warning Msg: "
#define WARNING_BUILDER(x) __FILE__ "("STR1(__LINE__)") : Warning Msg: " __FUNCTION__ " requires " #x
#define WREVIEW WARNING_BUILDER(review)
#define WUT WARNING_BUILDER(unit-testing)
#ifdef SPECIAL_WARNINGS
#ifdef SPECIAL_WARNINGS_REVIEW
#define MARK_FOR_REVIEW() do { /
__pragma(message( WREVIEW )) /
} while (0)
#else
#define MARK_FOR_REVIEW
#endif
#ifdef SPECIAL_WARNINGS_UNIT_TEST
#define MARK_FOR_UNIT_TEST() do { /
__pragma(message( WUT )) /
} while (0)
#else
#define MARK_FOR_UNIT_TEST
#endif
#endif
// uncomment/set in build-environment to enable special warnings
//#define SPECIAL_WARNINGS
#ifdef SPECIAL_WARNINGS
// uncomment/set in build-environment if you want only code review warnings
//#define SPECIAL_WARNINGS_REVIEW
// uncomment/set in build-environment if you want only unit-test warnings
//#define SPECIAL_WARNINGS_UNIT_TEST
#endif
int main()
{
MARK_FOR_REVIEW();
MARK_FOR_UNIT_TEST();
}
Puede extenderlo fácilmente para satisfacer sus necesidades y agregar más advertencias. La buena parte de tener un sistema de este tipo es que puede activar selectivamente, por ejemplo, solo revisar elementos de código y no tener que preocuparse por nada más configurando la macro adecuada en la configuración de compilación.
Este permite que se use sin #pragma (creo que específico de Microsoft) y cuando lo presionas te lleva a la línea, ya que muestra el archivo y el número de línea como lo hace un mensaje de error / advertencia normal ya que ninguno de los otros parece para hacer esto. Esto solía funcionar sin el __pragma pero las versiones más nuevas de msvc lo requieren. Lo he estado usando desde hace algún tiempo en los 90''s. Yo uso Visual Studio 2013
#define MacroStr(x) #x
#define MacroStr2(x) MacroStr(x)
#define Message(desc) __pragma(message(__FILE__ "(" MacroStr2(__LINE__) ") :" #desc))
ejemplo:
Message("Need to add unit testing here")
salida: 1> c: / source / include / mithrilsoftware.h (180): "Necesito agregar pruebas de unidad aquí"
Usa el #
token . He publicado un ejemplo de MSDN a continuación:
// collisions.h
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : Warning Msg: "
// collisions.cpp
#pragma message(__LOC__"Need to do 3D collision testing")