Ответ 1
Ответьте больше в соответствии с тем, что я искал, здесь: fooobar.com/questions/84720/...
Извините @sarnold
Я отлаживал особенно коварную ошибку, которая, как я полагаю, вызвана неожиданными изменениями, которые возникают из-за различного поведения, когда включены разные заголовки (или нет).
Это не совсем структура моего кода, но давайте просто взглянем на этот сценарий:
#include "Newly_created_header_which_accidentally_undefines_SOME_DEFINE.h"
// ...
#ifdef SOME_DEFINE
code_which_i_believe_i_am_always_running();
#else
code_which_fails_which_i_have_forgotten_about(); // runtime error stack traces back here, but I don't know this... or maybe it some strange linker error
#endif
Я просматриваю свой git коммит и сужу причину ошибки, компиляцию и запуск моего кода бесчисленное количество раз, только чтобы найти через несколько часов, что единственное различие, необходимое для возникновения ошибки, - это включение того, что появляется быть полностью доброкачественным и несвязанным заголовком.
Возможно, это отличный аргумент в пользу того, почему препроцессор в основном просто отстой.
Но мне это нравится. Препроцессор классный, потому что он позволяет создавать ярлыки. Это только то, что некоторые из этих ярлыков, когда они не используются осторожно, очень сильно наскучат в прикладе.
Итак, на этом этапе это помогло бы, если бы я мог использовать директиву типа #echo "Running old crashy code"
, где я смогу увидеть эту во время компиляции, чтобы сразу можно было опробовать, чтобы начать расследование причин SOME_DEFINE не определен.
Насколько я знаю, простой способ определить, определен ли SOME_DEFINE, это сделать что-то вроде
#ifndef SOME_DEFINE
printf("SOME_DEFINE not defined!!\n");
Это, безусловно, выполнит эту работу, но нет достаточной причины для выполнения этой задачи во время выполнения, поскольку она полностью определяется во время компиляции. Это просто то, что я хотел бы видеть во время компиляции.
При этом в этой ситуации использование печати (или журнала или даже исключения исключений) может быть приемлемым, потому что я не буду заботиться о замедлении или загромождении сомнительного кода. Но это не применяется, если у меня есть, например, два кодовых пути, оба из которых важны, и я просто хочу знать во время компиляции, который активируется. Мне нужно будет беспокоиться о запуске кода, который выполняет печать с предварительным обработкой в начале программы.
На самом деле это довольно длинный способ задать вопрос: "Можно ли эхо-строку выводить на выходе во время компиляции с помощью директивы препроцессора?"
Ответьте больше в соответствии с тем, что я искал, здесь: fooobar.com/questions/84720/...
Извините @sarnold
Если вы используете директиву #error
, вывод будет напечатан напрямую и компиляция остановится:
$ make days_in_month
cc days_in_month.c -o days_in_month
days_in_month.c:2:2: error: #error "ugly!"
make: *** [days_in_month] Error 1
$
Это может быть не совсем то, что вы хотели, но оно быстро выполняется.
$ cat days_in_month.c
#include <stdio.h>
#error "ugly!"
...
Если вы хотите продолжить обработку, вы можете использовать #warning
:
$ make days_in_month
cc days_in_month.c -o days_in_month
days_in_month.c:2:2: warning: #warning "ugly!" [-Wcpp]
$ head days_in_month.c
#include <stdio.h>
#warning "ugly!"