Я запутался между конструкциями конструкции if
/else
и #if
/#else
/#endif
.Разница между if else и #if #else #endif
- В чем разница между ними?
- В каких конкретных ситуациях я должен использовать каждый из них?
Я запутался между конструкциями конструкции if
/else
и #if
/#else
/#endif
.Разница между if else и #if #else #endif
Я смущен относительно if/else и # if/# else/# endif. Кажется, что имеют одинаковую логическую функциональность.
Могу ли я спросить, в чем разница между ними?
#if
, #else
и #endif
принадлежат предварительной обработки. Они не выполнены, но являются инструкциями по замене текста. Вы можете думать о них как о виде автоматической «функции поиска &», которую вы обычно находите в текстовом редакторе.
if
и else
- это конструкции времени исполнения. Вы можете думать о них как о запуске во время работы программы.
Допустим, у вас есть эта программа:
#include <iostream>
#define VALUE 1
int main()
{
#if VALUE == 1
std::cout << "one\n";
#else
std::cout << "not one\n";
#endif
}
Когда вы говорите ваш компилятор для компиляции этой программы, препроцессор сделать текстовую замену до «реального» код C++ на самом деле компиляции.Это будет, как если бы программа была:
#include <iostream>
int main()
{
std::cout << "one\n";
}
Теперь, технически можно использовать if
здесь:
#include <iostream>
#define VALUE 1
int main()
{
if (VALUE == 1)
{
std::cout << "one\n";
}
else
{
std::cout << "not one\n";
}
}
Но в C++ вы не использовать #define
для констант. Вместо этого вы должны иметь что-то вроде:
#include <iostream>
int const value = 1;
int main()
{
if (value == 1)
{
std::cout << "one\n";
}
else
{
std::cout << "not one\n";
}
}
Возможно, значение известно только во время выполнения программы, например. через пользовательский ввод. Тогда вы, очевидно, не можете использовать #if
, который работает только до запуска программы. Вы должны использовать if
:
#include <iostream>
int main()
{
int value;
std::cin >> value; // gross simplification here
if (value == 1)
{
std::cout << "one\n";
}
else
{
std::cout << "not one\n";
}
}
What kind of specific situations for me to choose each of them?
Хороший ориентир для новичка будет: Использование #if
(или на самом деле: #ifndef
) только для include guards. Рассмотрим дальнейшие применения #if
, когда вы сталкиваетесь с проблемами, которые могут быть решены только препроцессором.
Спасибо за помощь. Теперь я читаю исходный код opencv, тогда я нахожу, что в файлах head есть много определений marco. Означает ли это, что эти определения marco хорошо говорят препроцессору, какие исходные файлы компилируются? – za17
@ za17: не зная OpenCV, я бы сказал, что они либо включают в себя защитники (т. Е. Предотвращают множественную обработку одного и того же заголовочного файла), либо обеспечивают специальную обработку для разных компиляторов. –
if(...)
и else(...)
Условия оцениваются во время выполнения. #if
, #else
оцениваются до времени компиляции препроцессором.
еще до компиляции;) – m47h
@ m47h: достаточно справедливо, отредактировано. – wolfPack88
Могу ли я спросить, в чем различия между ними?
#if
#else
и #endif
инструкции для компилятора, только компилировать код между ними, если условие уровня компиляции (как макрос определяется или имеющие определенное значение) выполнено.
if
и else
являются частью скомпилированного алгоритма.
Какие конкретные ситуации для меня выбрать каждый из них?
Условия предварительной компиляции используются для отключения частей кода в ситуациях, когда они не имеют смысла (например, вызовы API-интерфейсов Windows при компиляции под Linux). Они являются ключевыми для разработки межплатформенного кода (например).
Нет, у них нет одинаковой логической функциональности, и у них нет такого. –
Почему бы вам не попробовать заменить 'if' на' # if' и посмотреть, работает ли он правильно. –
Поведение, управляемое макросами, происходит в разное время, чем синтаксис. Нет, у них нет такой же логической функциональности. – Stefan