Это может сработать, но это опасно.Порядок построения глобальных / статических элементов в одном модуле не определен, как и порядок загрузки модулей (если вы не управляете им явно).Например, вы предполагаете, что во время выполнения ctor в initial.c Initialize () i уже присутствует.Вы должны быть очень осторожны, чтобы два модуля не инициализировали одни и те же общие данные, или чтобы два модуля выполняли инициализацию с перекрывающимися побочными эффектами.
Я думаю, что более чистый дизайн для решения такой проблемы должен иметьвладелец общих данных (ваш главный модуль) представляет их как глобальный синглтон с интерфейсом для выполнения любых инициализаций данных.У вас будет центральное место для контроля порядка инициализации и, возможно, даже для управления одновременным доступом (с использованием критических секций или других примитивов параллелизма).В соответствии с вашим упрощенным примером, это может быть -
/ основной модуль (main.c) /
# включает класс CommonDat {int i;
public:
const int GetI() { return i;}
void SetI(int newI) { i = newI; }
void incI()
{
AcquireSomeLock();
i++;
ReleaseTheLock();
}
}
CommonDat g_CommonDat;
CommonDat* getCommonDat() { return &g_CommonDat; }
int main(void)
{
printf("%d",getCommonDat()->GetI());
}
Также желательно, чтобы вторичные модули вызывали эти интерфейсы в управляемые моменты времени во время выполнения (и не во время передачи глобальных ключей).
(ПРИМЕЧАНИЕ: выназвал файлы как файлы C, но отметил вопрос как c ++. Предлагаемый код, конечно, c ++).