Есть ли переносимый способ распечатать сообщение из препроцессора C?


99

Я бы хотел сделать что-нибудь вроде

#print "C Preprocessor got here!"

в целях отладки. Какой лучший / самый портативный способ сделать это?

Ответы:


115

Эта warningдиректива, вероятно, наиболее близка к вам, но она не полностью независима от платформы:

#warning "C Preprocessor got here!"

AFAIK это работает на большинстве компиляторов, кроме MSVC, для которых вам нужно будет использовать pragmaдирективу:

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

5
Возникает вопрос, можете ли вы поместить директиву, основанную на флаге компиляции, чтобы как-то поменять местами «сообщение прагмы» и «предупреждение»? Например, что-то вроде: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Мне придется попробовать, но инстинкт подсказывает мне, что ответ отрицательный.
Брайан

11
@ Брайан: Да. #define WARNING(msg) _Pragma("message " #msg)
Мэтт Джойнер

1
#pragma message () не поддерживается более старыми версиями gcc (такими как gcc 4.1.2, версия по умолчанию в RHEL5). Мне еще предстоит найти подходящий эквивалент для этих более старых версий - #warning не будет отличным вариантом, поскольку предупреждения обычно рассматриваются как ошибки, и мы действительно хотели бы, чтобы сообщение было информационным, а не останавливало компиляцию.
Danny S

6
Выдавать предупреждение очень неудобно, если ваш проект по умолчанию компилируется с -Wall. Сообщение #pragma не имеет такой проблемы.
Ренан Джеминьяни

56

Следующее поддерживается MSVC и GCC .

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

Clang недавно начал добавлять поддержку, подробнее см. Здесь .


3
Для записи: Solaris Studio 12.3 (Sun C 5.12) не поддерживает эту прагму.
maxschlepzig

Работает с Arduino 1.8 с использованием Visual Studio vMicro. Спасибо!
save_jeff


9

Большинство компиляторов C распознают #warningдирективу, поэтому

 #warning "Got here"

Также есть стандартная директива #error,

 #error "Got here"

Хотя все компиляторы поддерживают это, он также остановит компиляцию / предварительную обработку.


6
#pragma message("foo")

прекрасно работает. Также не остановит компиляцию, даже если вы используете -Werror


0

Другое решение - использовать комментарии и сценарий оболочки для их обработки. Это требует некоторой дисциплины (или сценария оболочки, который обнаруживает опечатки).

Например, я добавляю отформатированные комментарии, //TODOа затем скрипт оболочки, который собирает их все в отчет.

Для более сложных случаев использования вы можете попробовать написать собственный простой препроцессор. Например, вы можете редактировать свои источники как *.c2файлы. Простой препроцессор будет читать исходный код, искать //TODOи записывать printf("TODO ...")в выходной *.cфайл.


-17

Вы не можете. Препроцессоры обрабатываются до кода C. Нет никаких директив препроцессора для вывода на экран, поскольку код препроцессора не выполняется, он используется для генерации кода C, который будет скомпилирован в исполняемый код.

Что-то не так с:

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

Потому что это все, что вы можете сделать с препроцессорами.


5
Это не будет печататься во время компиляции, что, как я думаю, ищет OP.
Боб Кауфман,

Я предположил, что он имел в виду печать во время выполнения.
Александр Рафферти,

1
Я спрашивал о времени компиляции. Спасибо!
Эндрю Вагнер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.