26

Para agregar elementos 'todo' a mi código, quiero poner un mensaje en la salida del compilador.
me gustaría que se vea como esto:¿Cómo puedo usar #pragma message() para que el mensaje apunte al archivo (lineno)?

c:/temp/main.cpp(104): TODO - add code to implement this 

con el fin de hacer uso de la funcionalidad de salida de Visual Studio acumulación de navegar a la línea respectiva haciendo doble clic en él.

Pero el __LINE__ macro parece expandirse a un int, que no permite escribiendo

#pragma message(__FILE__ "("__LINE__"): ...") 

Habría otro modo?

Respuesta

31

Esta es la que le permite hacer clic en el panel de salida: 0

(también hay algunos otros consejos agradables 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 definidos, utilice este modo:

#pragma message(Reminder "Fix this problem!") 

Esta salida se creará como:

C: \ Source \ Project \ main.cpp (47): Recordatorio: soluciona este problema.

+0

La versión detrás del enlace funciona mejor;) – xtofl

+0

¿Cómo es "#define $ Line" incluso una directiva de preprocesador válida? Estoy mirando directamente al signo de dólar. –

+0

@VinnieFalco Ver http://stackoverflow.com/questions/369495/what-are-the-valid-characters-for-macro-names No pude encontrar ninguna fuente en los tokens permitidos para macros en VS, así que estoy adivinando lo admite – RedX

0

Utilice # 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") 
+0

no es tan simple, necesita expandir '__LINE__' a su forma entera antes de convertirlo en una cadena – Necrolis

+0

@Necrolis: Encontré el artículo KB de MSDN para esto y publiqué un fragmento – Jacob

+4

Mientras que Microsoft está dentro de sus derechos para definir símbolos con doble subrayados, usted debería evitarlos. El estándar los reserva para los identificadores creados por el fabricante del compilador. –

7

simplemente batida esto ahora, y seguro que supera mi vieja solución de utilizar #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 cómo quiera que te gusta/a lo que se ajuste a tus necesidades. Un ejemplo de su uso:

//in code somewhere 
TODO(Fix this); 

de salida en el panel de la consola:

1>TODO: Fix this :: c:\users\administrator\documents\visual studio 2008\projects\metatest\metatest\[email protected] 

único inconveniente es que no se puede saltar a la línea de este (haciendo doble clic en el mensaje en el panel de la consola) no parece usando __pragma (pero las pruebas con #pragma ser el caso de todos modos ...)

+1

¿Por qué STR y _STR? –

+0

@Martinho: veame comentar la respuesta de Jacobs – Necrolis

+0

Solo una nota, '__pragma()' no existe antes de VS2010 ... Afortunadamente la pregunta está etiquetada como 2010 pero me preguntaba por qué no estaba funcionando. –

2

Esta es una adición a la respuesta para aquellos a quienes les resulta tedioso para un puñetazo en #pragma directivas cada vez que necesitan para poner un marcador en el código: Usted puede ahorrar unos cuantos golpes de teclado por azotar encima de una macro para hacer ¡este para ti! Si bien, en general, no puede tener una directiva #pragma dentro de las macros, los compiladores MS C/C++ 2008 y posteriores admiten una extensión especial específica del fabricante llamada __pragma que se puede usar con macros. Ver Pragma Directives and the __Pragma Keyword.

utilizo algo parecido a lo siguiente sobre una base diaria:

#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(); 
} 

Se puede ampliar fácilmente para satisfacer sus necesidades y añadir más advertencias. La parte buena de tener un sistema así es que puedes activar selectivamente, solo revisar los elementos de los códigos y no tener que preocuparte por nada más configurando la macro apropiada en la configuración de compilación.

1

Esto permite usarlo sin #pragma (lo que yo creo que es específico de Microsoft) y al hacer clic lo lleva a la línea ya que muestra el número de línea y archivo como lo hace un mensaje de error/advertencia ya que ninguno de los otros parecen hacer esto. Esto solía funcionar sin el __pragma pero las versiones más nuevas de msvc lo requieren. Lo he usado desde algún momento en los años 90. Yo uso de 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") 

de salida: 1> c: \ source \ include \ mithrilsoftware.h (180): "necesidad de agregar la unidad de pruebas aquí"

+0

Es el formato de su mensaje el que decide si se puede "hacer clic" en VS. De hecho, '__pragma', con sus dos guiones bajos principales, es específico de la herramienta. Además de eso, '# pragma', aunque no es estándar, es compatible con la mayoría de los toolchains (gcc, clang, vs ...) también. – xtofl

Cuestiones relacionadas