2015-03-11 2 views
-8

Я запутался между конструкциями конструкции if/else и #if/#else/#endif.Разница между if else и #if #else #endif

  1. В чем разница между ними?
  2. В каких конкретных ситуациях я должен использовать каждый из них?
+9

Нет, у них нет одинаковой логической функциональности, и у них нет такого. –

+1

Почему бы вам не попробовать заменить 'if' на' # if' и посмотреть, работает ли он правильно. –

+0

Поведение, управляемое макросами, происходит в разное время, чем синтаксис. Нет, у них нет такой же логической функциональности. – Stefan

ответ

4

Я смущен относительно 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, когда вы сталкиваетесь с проблемами, которые могут быть решены только препроцессором.

+0

Спасибо за помощь. Теперь я читаю исходный код opencv, тогда я нахожу, что в файлах head есть много определений marco. Означает ли это, что эти определения marco хорошо говорят препроцессору, какие исходные файлы компилируются? – za17

+0

@ za17: не зная OpenCV, я бы сказал, что они либо включают в себя защитники (т. Е. Предотвращают множественную обработку одного и того же заголовочного файла), либо обеспечивают специальную обработку для разных компиляторов. –

10

if(...) и else(...) Условия оцениваются во время выполнения. #if, #else оцениваются до времени компиляции препроцессором.

+1

еще до компиляции;) – m47h

+0

@ m47h: достаточно справедливо, отредактировано. – wolfPack88

4

Могу ли я спросить, в чем различия между ними?

#if#else и #endif инструкции для компилятора, только компилировать код между ними, если условие уровня компиляции (как макрос определяется или имеющие определенное значение) выполнено.

if и else являются частью скомпилированного алгоритма.

Какие конкретные ситуации для меня выбрать каждый из них?

Условия предварительной компиляции используются для отключения частей кода в ситуациях, когда они не имеют смысла (например, вызовы API-интерфейсов Windows при компиляции под Linux). Они являются ключевыми для разработки межплатформенного кода (например).

Смежные вопросы