Чи є портативний спосіб надрукувати повідомлення від препроцесора C?


99

Мені б хотілося зробити щось подібне

#print "C Preprocessor got here!"

для налагодження. Який найкращий / найбільш портативний спосіб це зробити?

Відповіді:


114

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
@Bryan: Так. #define WARNING(msg) _Pragma("message " #msg)
Метт Столяр

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

6
Видавати попередження дуже незручно, коли ваш проект за замовчуванням компілюється з -Wall. Повідомлення #pragma не має такої проблеми.
Ренан Джеміньяні

56

Наступні підтримуються MSVC та GCC .

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

Кланг почав додавати підтримку останнім часом, дивіться тут докладніше.


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

Ви не можете. Передпроцесори обробляються перед кодом С. Немає директив препроцесора для друку на екран, оскільки код препроцесора не виконується, він використовується для генерування коду С, який буде компільований у виконуваний код.

Щось не так:

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

Тому що це все, що ти можеш зробити, якщо йдеться про препроцесори.


5
Це не буде надруковано під час компіляції, що я думаю, що ОП шукає.
Боб Кауфман

Я припускав, що він мав на увазі друк під час виконання.
Олександр Рафферті

1
Я запитував про час компіляції. Дякую!
Ендрю Вагнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.