Могу ли я заставить препроцессор С++ отправлять выходные данные во время компиляции?

Я отлаживал особенно коварную ошибку, которая, как я теперь полагаю, вызвана неожиданными изменениями, происходящими из-за различного поведения, когда разные заголовки включены (или нет ).

Это не совсем структура моего кода, но давайте просто взглянем на этот сценарий:

#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's some strange linker error
#endif

Я просматриваю свои коммиты git и сужаю причину ошибки, компилируя и запуская свой код бесчисленное количество раз, только для того, чтобы через несколько часов обнаружить, что единственное отличие, необходимое для возникновения ошибки, — это включение того, что кажется совершенно безобидным и несвязанный заголовок.

Возможно, это отличный аргумент в пользу того, почему препроцессор просто отстой.

Но мне нравится это. Препроцессор — это круто, потому что он позволяет нам делать ярлыки. Просто некоторые из этих ярлыков, если ими пользоваться неосторожно, довольно сильно кусают нас за задницу.

Так что на данном этапе было бы полезно, если бы я мог использовать директиву вроде #echo "Running old crashy code", где я смогу увидеть это во время компиляции , чтобы я мог немедленно начать расследование, почему НЕКОТОРЫЕ _DEFINE не был определен.

Насколько я знаю, простой способ определить, определено ли SOME _DEFINE, состоит в том, чтобы сделать что-то вроде

#ifndef SOME_DEFINE
    printf("SOME_DEFINE not defined!!\n");

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

Тем не менее, в этой ситуации использование печати (или журнала или даже создание исключения )может быть приемлемым, потому что я не буду беспокоиться о замедлении или загромождении сомнительного кода. Но это неприменимо, если у меня есть, например, два пути кода, оба из которых важны, и я просто хочу знать во время компиляции -, какой из них активируется. Мне пришлось бы беспокоиться о запуске кода, который выполняет условную печать препроцессора -в начале программы.

На самом деле это просто -запутанный способ задать вопрос: «Могу ли я вывести строку на вывод во время компиляции с помощью директивы препроцессора?»

19
задан Brian Tompsett - 汤莱恩 14 February 2016 в 11:03
поделиться