Другие языки программирования и технологии
вопрос по c++ .не могу точно понять использование #ifdef, #ifndef.
И как можно это использовать вместо if, допустим для проверки на ошибки. Дайте небольшой пример. Спасибо
#ifdef ни разу не замена if. Цели и задачи разные. И логичнее сравнивать тогда #if и if. #ifdef/#ifndef/#if работают на уровне "препроцессора", в то время как if работает непосредственно в коде (если не будет выкинут оптимизатором =).
https://ru.wikipedia.org/wiki/Препроцессор_Си (да это справедливо для C++). Т. е. взаимодействовать на этапе сборки кода.
--- Можно использовать для проверки параметров в #define (для простого примера, в C++ именно такой define у профи крайне сомнителен)
#define ArraySize 10
#ifndef ArraySize
//#error заставит компилятор прервать сборку с ошибкой.
//Вы не сделаете это синтаксически корректным if. И не надо =)
#error ArraySize (размер массива) не задан
#enfif
#if ArraySize < 0
#error ArraySize (размер массива) отрицателен!
#endif
--- #ifdef можно использовать для условной компиляции.
Н-р можно сделать проверку, чтобы компилятор не пытался собрать весь код не под Linux системами и соотв. сообщить внятно причину проблемы, тому, кто пытается собрать код.
#ifndef __linux__
#error Этот код только для Linux систем
#endif
или н-р условная компиляция для установки символа-разделителя.
Если "Linux" pathDelimiter = '/', если Windows '\' иначе ошибка
const char pathDelimiter =
#ifdef __linux__
'/';
#elif __WIN32
'\\';
#else
'\0';
#error Платформа не поддерживается. Задайте разделитель
#endif
https://ru.wikipedia.org/wiki/Препроцессор_Си (да это справедливо для C++). Т. е. взаимодействовать на этапе сборки кода.
--- Можно использовать для проверки параметров в #define (для простого примера, в C++ именно такой define у профи крайне сомнителен)
#define ArraySize 10
#ifndef ArraySize
//#error заставит компилятор прервать сборку с ошибкой.
//Вы не сделаете это синтаксически корректным if. И не надо =)
#error ArraySize (размер массива) не задан
#enfif
#if ArraySize < 0
#error ArraySize (размер массива) отрицателен!
#endif
--- #ifdef можно использовать для условной компиляции.
Н-р можно сделать проверку, чтобы компилятор не пытался собрать весь код не под Linux системами и соотв. сообщить внятно причину проблемы, тому, кто пытается собрать код.
#ifndef __linux__
#error Этот код только для Linux систем
#endif
или н-р условная компиляция для установки символа-разделителя.
Если "Linux" pathDelimiter = '/', если Windows '\' иначе ошибка
const char pathDelimiter =
#ifdef __linux__
'/';
#elif __WIN32
'\\';
#else
'\0';
#error Платформа не поддерживается. Задайте разделитель
#endif
#ifdef вычисляется на момент компиляции. Там в качестве аргумента должно быть константное выражение
кусок кода между #ifdef / endif с невыполненным условием даже не передаётся в компилятор, его как будто и не было
кусок кода между #ifdef / endif с невыполненным условием даже не передаётся в компилятор, его как будто и не было
Похожие вопросы
- Какой вопрос можно задать человеку, чтобы точно понять что он специалист в области программирования?
- c++ не могу понять в чем ошибка в небольшом примере
- Ещё тупой вопрос по C++ :)
- Какой из языков программирования лучше, приоритетнее C++ или Pyton (простота, частота использования и тд.)?
- Вопрос по c++ )
- Тупые вопросы по C#) Конструкторы, set, get.
- Вопрос по C++
- Задача по C++ Не могу придумать как одновременно записывать в массив и считать функцию.
- Вопрос для знатоков комп. железа! Помогите понять - что здесь написано? Экран появляется всего на 1 секунду. Еле поймал.
- вопрос по C++ как работать с заголовками? компилятор ругается, непойму как связать 3 файла. исходники внутри.
"Если "Linux" pathDelimiter = '/', если Windows '\' иначе ошибка" -почему вы это сейчас говорите, а не пару месяцев назад)