const и constexpr (С++11)
В яп С++ есть два вида констант:
- Константы времени компиляции - их значения определяются еще на этапе компиляции
- Константы времени выполнения (runtime) - их значения можно определить только во время выполнения программы
В большинстве случаев какую константу использовать не имеет значения, однако в особых случаях компилятор может запросить константу определенного вида (например длина массива должна быть известна еще на этапе компиляции).
Соответственно, компилятору необходимо постоянно отслеживать вид констант, чтобы упростить это задание, в С++11 был добавлен constexpr, который сообщает компилятору, что текущая переменная - константа времени компиляции.
constexpr double gravity = 9.8; // времени компиляции
constexpr int sum = 4 + 5; // времени компиляции
int age;
std::cin >> age;
const int my_age = age; // runtime
#define vs const
#define | const\constexpr |
---|---|
Имеет глобальную область видимости | Любая область видимости |
Макросы не заменяются во время отладки | Легче в отладке |
Занимается препроцессор | Занимается компилятор |
На макрос нельзя создать указатель | На константу можно создать указатель |
Может быть type checked |
Стоит обратить внимание, что речь идет только о константах, использовать директивы условной компиляции все так же полезно: #ifdef #if.