Сионист » 02 апр 2017, 19:16
В переменной? Или в величине? Вот в чём хитрость. Не всякая величина переменна. Есть ещё макросы, литералы и константы, они известны на этапе разработки и могут быть проверены статически. В результате можно, изменив всего несколько символов в одном месте, существенно изменить код, иногда разбросанный по всей программе. Это и есть условная компиляция. Только обычно на c++ проверяется всё таки не значение, а факт существования. Но в принципе можно написать препроцессор, компилятор, или саму среду с поддержкой условной компиляции с условиями на значения. Предусмотрен ли такой вид условной компиляции в более менее распространённых софтинах, тем более включен ли в стандарт, мне не известно. Но в принципе такая условная компиляция возможна. А о переменных на этапе разработки известно только как их зовут, какие у них типы, сколько они должны занимать места в памяти и по каким смещениям и от чего лежат. Ну ещё инициируются ли они и чем именно. Сама программа на момент статических проверок, статического связывания, статической типизации... ещё даже не запущена и ничего проверять не может. Мало того, исполняемого её варианта просто нет, она существует только в исходном тексте, максимум в сыром объектом коде. Поэтому сама разрабатываемая программа занимается только динамическими проверками. Но если она инструментальная, то для приложений, разрабатываемых с её помощью такие проверки будет статическими в том случае, если реализуется компиляция. Но в тех программах статически проверяется другое, вовсе не внутреннее представление макросов, констант и литералов в инструментальной программе. И константа не обязана иметь адрес, например, на многих компилируемых реализациях паскаля значения всех констант, чьи типы вводятся компилятором, подставляются при компиляции. На c++ нет аналога. Типизация этих констант статическая не явная, выглядит похоже на динамическую (и не явная, и динамическая типизация - это типизация на основе значения и в момент получения значения, но не явная статическая типизация - это типизация на основе первого или единственного значения в момент его получения, а динамическая типизация может быть и на основе каждого значения в моменты каждого изменения), что языком c++ не предусмотрено в принципе. Квалификатор const - не то же самое, что заголовок const. На c++ const лишь защищает от изменения нечто, похожее на переменную. Но величины, объявленные в разделе const на паскале - это и не макросы, так как константы во-первых имеют область видимости, а макросы её не имеют, а во-вторых константы хоть как то типизированы, а макросы не типизированы вовсе.
В переменной? Или в величине? Вот в чём хитрость. Не всякая величина переменна. Есть ещё макросы, литералы и константы, они известны на этапе разработки и могут быть проверены статически. В результате можно, изменив всего несколько символов в одном месте, существенно изменить код, иногда разбросанный по всей программе. Это и есть условная компиляция. Только обычно на c++ проверяется всё таки не значение, а факт существования. Но в принципе можно написать препроцессор, компилятор, или саму среду с поддержкой условной компиляции с условиями на значения. Предусмотрен ли такой вид условной компиляции в более менее распространённых софтинах, тем более включен ли в стандарт, мне не известно. Но в принципе такая условная компиляция возможна. А о переменных на этапе разработки известно только как их зовут, какие у них типы, сколько они должны занимать места в памяти и по каким смещениям и от чего лежат. Ну ещё инициируются ли они и чем именно. Сама программа на момент статических проверок, статического связывания, статической типизации... ещё даже не запущена и ничего проверять не может. Мало того, исполняемого её варианта просто нет, она существует только в исходном тексте, максимум в сыром объектом коде. Поэтому сама разрабатываемая программа занимается только динамическими проверками. Но если она инструментальная, то для приложений, разрабатываемых с её помощью такие проверки будет статическими в том случае, если реализуется компиляция. Но в тех программах статически проверяется другое, вовсе не внутреннее представление макросов, констант и литералов в инструментальной программе. И константа не обязана иметь адрес, например, на многих компилируемых реализациях паскаля значения всех констант, чьи типы вводятся компилятором, [b]подставляются[/b] при компиляции. На c++ нет аналога. Типизация этих констант статическая не явная, выглядит похоже на динамическую (и не явная, и динамическая типизация - это типизация на основе значения и в момент получения значения, но не явная статическая типизация - это типизация на основе первого или единственного значения в момент его получения, а динамическая типизация может быть и на основе каждого значения в моменты каждого изменения), что языком c++ не предусмотрено в принципе. Квалификатор const - не то же самое, что заголовок const. На c++ const лишь защищает от изменения нечто, похожее на переменную. Но величины, объявленные в разделе const на паскале - это и не макросы, так как константы во-первых имеют область видимости, а макросы её не имеют, а во-вторых константы хоть как то типизированы, а макросы не типизированы вовсе.