Линковка констант Ч2



Мы узнали один из вариантов, как можно подключать константы в свои файлы с кодом. Однако у него были проблемы, которые мы попытаемся решить сегодня.



Все проблемы прошлого варианта по сути сводится к последствиям внутренней линковки.



Если у нас будет только одно определение переменной и весь остальной код будет только ссылаться на него, то решится проблема с перекомпиляцией. Потому что задача подстановки символов будет решаться при линковке. Во всех единицах трансляции будет просто заглушка для этой константы. И реальное значение будет подставляться компановщиком. А значит ничего не нужно заново компилировать.



Одно определение также решит вопрос нежелательного расхода памяти, так как экземпляр константы будет один и занимать одну условную единицу памяти. Никакого дублирования не будет.



Как мы можем добиться, чтобы определение констант было всего одно?



Обеспечить им внешнее связывание. С помощью ключевого слова extern.



//constant.cpp

#include "constant.hpp"



namespace constants

{

const unsigned light_speed { 299'792'458 };

const double avogadro { 6.0221413e23 };

// ... other related constants

}




//constant.hpp

#pragma once



namespace constants

{

extern const unsigned light_speed;

extern const double avogadro;

// ... other related constants

}




Теперь константы будут создаваться только один раз (в единице трансляции соотвествующей constants.cpp), а не каждый раз при включении constants.h, и все использования будут просто ссылаться на версию в constants.cpp. Любые внесенные изменения в constants.cpp потребуют только перекомпиляции constants.cpp.



Однако и у этого метода есть несколько недостатков(да штож такое).



1️⃣ Эти константы теперь могут считаться константами времени компиляции только в файле, в котором они фактически определены (constants.cpp), а не где-либо еще. Это означает, что вне constants.cpp они не могут быть использованы нигде, где требуются вычисления в compile-time. Печально.



2️⃣ В принципе оптимизировать их использование компилятору сложнее, потому что он не имеет доступа к настоящему значению.



3️⃣ Неудобно просто. Каждый раз нужно ходить в реализацию, чтобы удостовериться в значении константы - такое себе. Да, современные IDE могут решить этот вопрос. А могут и не решить. Плюс нужно или мышку наводить или кнопки какие-то нажимать. Слишком много действий!

Шучу конечно. Но намного удобнее определение держать в хэдере.



Учитывая вышеперечисленные недостатки, хочется определять константы в заголовочном файле. Наконец-то мы подбираемся к самой мякотке. Но об этом - в следующих постах)



Stay in touch. Stay cool.



#cppcore #compiler