Обнаружил это в коде и не уверен, в чем смысл.
#if !NO_HW
//code
#endif
saveSettingsFile();
}
Я никогда не видел #if #endif внутри такой функции (SLOT), только традиционные #ifndef #define #endif внутри объявлений заголовочных файлов. Я копался в Интернете и обнаружил, что #if (condition) ..code.. #endif промежуточный код выполняется, когда условие истинно, что я могу понять, но мы #define NO_HW 0 ранее в коде, что означает, что всякий раз, когда вызывается эта функция SLOT, она всегда будет выполнять код между #if ... #endif, поскольку !NO_HW будет всегда возвращать ненулевое значение. NO_HW - это определенное имя_макроса со значением, поэтому мы не можем изменить его где-то позже в нашем коде, поэтому я не понимаю необходимости наличия #if !NO_HW ... #endif в нашем коде в первую очередь, помимо для если пользователь хочет иметь возможность позже отключить этот раздел кода, если определенное оборудование должно быть удалено (для нашего приложения я полагаю, что этот #define описывает аппаратное PXIe). (Я перенимаю чужой код, который в настоящее время работает.)
Как вы думаете, в этом ли смысл кода? Включить/отключить раздел
кода в зависимости от того, присутствует ли определенный аппаратный компонент, что делается в коде путем изменения того, что установлено #define NO_HW 0?
//DECLARATIONS
#define NO_HW 0
//later, inside a SLOT function
void MainWindow::setOptions(void)
{
#if !NO_HW //this is the line I don't understand
// lot of regular inline if (statment) inlineAction; lines follow
// ...
#endif
saveSettingsFile();
}
Я понимаю, но зачем кому-то использовать условие, чтобы оператор #if был глобальной переменной? Просто чтобы иметь возможность включать и выключать этот раздел кода?
Точно. лайк #if _DEBUG printf("This is an extra debug message"); #endif
Ах, понял, ладно, не знаю, как пометить вопрос как отвеченный сейчас, но спасибо.
Почему он будет действовать по-другому вне файла заголовка?
@DaveNewton Я не являюсь опытным кодером, поэтому я согласился с тем, как мы определяем файлы заголовков, чтобы позже мы могли #include "name.h" внутри файла .c или .cpp. Это немного отличается от включения только части кода с помощью #if COND ... #endif. Я не был уверен, спрашиваете ли вы, почему я был сбит с толку, или для разъяснения.
Директивы препроцессора не «определяют заголовочный файл», они используются где угодно (заголовок или нет), чтобы влиять на поведение во время компиляции, как пожелает разработчик.
@DaveNewton Итак, вы просто говорите, что главное заключается в том, что директивы препроцессора предварительно компилируются процессором до выполнения фактической программы, в основном это определение директив препроцессора. Правильный? Я ценю ваш комментарий, напоминающий мне о том, что, хотя файлы заголовков — это всего лишь одно приложение, основная мысль заключается в другом, но вы могли бы сделать это немного более познавательно, как я уже сказал, я учусь.





Макросы препроцессора можно использовать для включения/отключения части кода, например:
#if _DEBUG
printf("This is an extra debug message");
#endif
#define ROUNDING 0
float val = 1.2f;
#if ROUNDING
int a = (val + 0.5f); // If ROUNDING was 1, the val could have been rounded instead of floor.
#else
int a = val;
#endif
Оказывается, моя интуиция была верна (что подтверждается в комментариях пользователя @Vuwox). Использование глобальной переменной для условия внутри #if CONDITION ...code #endif внутри функции означает включение/отключение этого раздела кода простым изменением значения макроса, что намного проще сделать с помощью макропеременной, которая определена поверх кода. .
Да, ваша догадка верна. Это часто используется в C/C++, например, чтобы различать разные операционные системы и включать/отключать конфигурации, которые никогда не меняются во время выполнения.
Все это делает препроцессор перед компиляцией кода. gcc -E test.cpp для запуска только стадии препроцессора
// test.cpp
#include <iostream>
#define PRINT_A
int main(){
#ifdef PRINT_A
std::cout << "section a" << std::endl;
#endif
#ifdef PRINT_B
std::cout << "section b" << std::endl;
#endif
return 0;
}
int main(){
std::cout << "section a" << std::endl;
return 0;
}
int main(){
std::cout << "section a" << std::endl;
std::cout << "section b" << std::endl;
return 0;
}
Нормальный
ifотносится к тому, что вы указываете промежуточный код выполняется, когда условие истинно,#ifбудет составлено, если условие истинно.