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

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

#print "C Preprocessor got here!"

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

74 голоса | спросил Andrew Wagner 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 04:16:52 +0400 2010, 04:16:52

7 ответов


0

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

#warning "C Preprocessor got here!"

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

#pragma message ( "C Preprocessor got here!" )
ответил You 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 04:24:13 +0400 2010, 04:24:13
0

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

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

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

ответил Matt Joiner 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 04:26:19 +0400 2010, 04:26:19
0

Возможно, вы захотите попробовать: #pragma message("Hello World!")

ответил Ruel 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 04:24:51 +0400 2010, 04:24:51
0

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

 #warning "Got here"

Существует также стандартная директива #error,

 #error "Got here"

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

ответил nos 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 04:28:37 +0400 2010, 04:28:37
0
#pragma message("foo")

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

ответил Martin 28 FebruaryEurope/MoscowbSat, 28 Feb 2015 23:46:56 +0300000000pmSat, 28 Feb 2015 23:46:56 +030015 2015, 23:46:56
0

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

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

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

ответил Aaron Digulla 9 Jpm1000000pmMon, 09 Jan 2017 19:44:16 +030017 2017, 19:44:16
0

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

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

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

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

ответил Alexander Rafferty 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 04:21:31 +0400 2010, 04:21:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132