Я хотел бы иметь возможность сделать что-то вроде
#print "C Preprocessor got here!"
для целей отладки. Какой лучший/самый переносимый способ сделать это?
Я хотел бы иметь возможность сделать что-то вроде
#print "C Preprocessor got here!"
для целей отладки. Какой лучший/самый переносимый способ сделать это?
Директива warning
, вероятно, самая близкая к вам, но она не полностью независима от платформы:
#warning "C Preprocessor got here!"
AFAIK это работает на большинстве компиляторов, кроме MSVC, на котором вам придется использовать директиву pragma
:
#pragma message ( "C Preprocessor got here!" )
#pragma message("stuff")
#pragma message "stuff"
В последнее время Clang начал добавлять поддержку, см. здесь.
Возможно, вы захотите попробовать: #pragma message("Hello World!")
Большинство компиляторов C распознают директиву #warning
, поэтому
#warning "Got here"
Также существует стандартная директива '#error',
#error "Got here"
Пока все компиляторы поддерживают это, он также остановит компиляцию/предварительную обработку.
#pragma message("foo")
отлично работает. Также не прекращалась компиляция, даже если вы используете -Werror
Другое решение - использовать комментарии и оболочку script для их обработки. Это требует некоторой дисциплины (или оболочки script, которая ловит опечатки).
Например, я добавляю комментарии в формате //TODO
, а затем оболочку script, которая собирает все из них в отчет.
Для более сложных вариантов использования вы можете попытаться написать свой собственный простой препроцессор. Например, вы можете редактировать свои источники как файлы *.c2
. Простой препроцессор читает исходный код, ищет //TODO
и записывает printf("TODO ...")
в выходной файл *.c
.
Вы не можете. Препроцессоры обрабатываются до кода C. Для печати на экран нет препроцессорных директив, поскольку код препроцессора не выполняется, он используется для генерации кода C, который будет скомпилирован в исполняемый код.
Что-то не так:
#ifdef ...
printf("Hello");
#endif
Потому что это все, что вы можете сделать, поскольку препроцессоры идут.