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

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

#print "C Preprocessor got here!"

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

Ответ 1

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

#warning "C Preprocessor got here!"

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

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

Ответ 2

Ниже приведены MSVC и GCC.

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

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

Ответ 3

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

Ответ 4

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

 #warning "Got here"

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

 #error "Got here"

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

Ответ 5

#pragma message("foo")

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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