¿Existe una forma portátil de imprimir un mensaje desde el preprocesador de C?

99

Me gustaría poder hacer algo como

#print "C Preprocessor got here!"

con fines de depuración. ¿Cuál es la forma mejor / más portátil de hacer esto?

Andrew Wagner
fuente

Respuestas:

114

La warningdirectiva es probablemente lo más cercano que obtendrá, pero no es completamente independiente de la plataforma:

#warning "C Preprocessor got here!"

AFAIK, esto funciona en la mayoría de los compiladores, excepto MSVC, en el que tendrá que usar una pragmadirectiva:

#pragma message ( "C Preprocessor got here!" )

fuente
5
Lo que plantea la pregunta, ¿puede poner una directiva basada en una bandera de compilación para intercambiar "mensaje pragma" y "advertencia" de alguna manera? Por ejemplo, algo como: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... tendré que intentarlo, pero el instinto me dice que la respuesta es no.
Bryan
11
@Bryan: Sí. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner
1
#pragma message () no es compatible con versiones anteriores de gcc (como gcc 4.1.2, la versión predeterminada en RHEL5). Todavía tengo que encontrar un equivalente apropiado para estas versiones anteriores: #warning no va a ser genial, ya que las advertencias se tratan como errores para nosotros en general, y realmente nos gustaría que el mensaje fuera informativo, en lugar de detener la compilación.
Danny S
6
Emitir una advertencia es muy inconveniente cuando su proyecto se compila con -Wall por defecto. El mensaje #pragma no tiene ese problema.
Renan Gemignani
56

Los siguientes son compatibles con MSVC y GCC .

#pragma message("stuff")
#pragma message "stuff"

Clang ha comenzado a agregar soporte recientemente, consulte aquí para obtener más información.

Matt Joiner
fuente
3
Solo para que conste, Solaris Studio 12.3 (Sun C 5.12) no es compatible con este pragma.
maxschlepzig
Funciona con Arduino 1.8 usando Visual Studio vMicro. ¡Gracias!
save_jeff
12

Es posible que desee probar: #pragma message("Hello World!")

Ruel
fuente
9

La mayoría de los compiladores de C reconocerán una #warningdirectiva, por lo que

 #warning "Got here"

También existe la directiva estándar '#error',

 #error "Got here"

Si bien todos los compiladores lo admiten, también detendrá la compilación / preprocesamiento.

nos
fuente
6
#pragma message("foo")

Funciona genial. Además, no detendría la compilación incluso si usa -Werror

Martín
fuente
0

Otra solución es utilizar comentarios más un script de shell para procesarlos. Esto requiere algo de disciplina (o un script de shell que detecta errores tipográficos).

Por ejemplo, agrego comentarios formateados //TODOy luego un script de shell que los recopila todos en un informe.

Para casos de uso más complejos, puede intentar escribir su propio preprocesador simple. Por ejemplo, puede editar sus fuentes como *.c2archivos. El preprocesador simple leería la fuente, buscaría //TODOy escribiría printf("TODO ...")en el *.carchivo de salida .

Aaron Digulla
fuente
-17

No puedes. Los preprocesadores se procesan antes que el código C. No hay directivas de preprocesador para imprimir en la pantalla, porque el código del preprocesador no se ejecuta, se usa para generar el código C que se compilará en código ejecutable.

Cualquier problema con:

#ifdef ...
printf("Hello");
#endif

Porque esto es todo lo que puede hacer en lo que respecta a los preprocesadores.

Alexander Rafferty
fuente
5
Esto no se imprimirá en tiempo de compilación, que es lo que estoy pensando que OP está buscando.
Bob Kaufman
Supuse que se refería a imprimir en tiempo de ejecución.
Alexander Rafferty
1
Estaba preguntando sobre el tiempo de compilación. ¡Gracias!
Andrew Wagner