c++ visual-studio-2010 pragma line-numbers predefined-macro

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")