Вы могли бы даже (в публичном заголовке) определить некоторую встроенную функцию, возвращающую внешнюю переменную, имя которой достаточно длинное, чтобы ее нельзя было легко угадать, например,
static inline double getTime(void) {
extern double somelongname_simTime; // don't use that name directly
return somelongname_simTime;
}
действительно,имя somelongname_simTime
является общедоступным, но требует непосредственного использования злого умысла (поскольку оно не объявлено в области видимости файла в общедоступном заголовочном файле).
(и вы даже можете использовать namespace
трюки)
Обратите внимание, что компилятор не может предотвратить неопределенное поведение, такое как указатель, случайно получающий адрес переменной static
.
А в Linux вы даже можете сыграть некоторую visibility трюки.
С GCC специально вы можете попытаться использовать два имени в одной и той же глобальной памяти (используя метки ассемблера * 1025)*), например, в вашем общедоступном заголовке
extern volatile const double simTime_public asm ("myrealsimTime");
и в каком-то файле реализации вы будете иметь вместо этого
double simTime_private asm("myrealsimTime");
Конечно, вы злоупотребляете компилятором и компоновщиком, когда играете такие трюки.
(и, очевидно, вы могли бы смешать оба подхода).