Другой альтернативой является то, что вы можете искать аналогию со статическим блок в Java. Блок кода, который запускается при загрузке приложения. В C ++ такого нет, но его можно подделать с помощью конструктора статический объект.
foo.cpp:
struct StaticBlock {
StaticBlock(){
cout << "hello" << endl;
}
}
static StaticBlock staticBlock;
void main(int, char * args[]){
}
ОДНАКО. Меня это уже укусило, так как это тонкий крайний случай C ++ стандарт. Если статический объект недоступен для какого-либо кода, вызываемого основным, конструктор статического объекта может вызываться или не вызываться.
Я обнаружил, что с помощью gcc вывод hello будет выводиться, а с помощью Visual Studio - нет.
В C / C ++ нет понятия «статический блок». Однако в Java есть «статический блок» - это блок кода инициализатора для класса, который запускается ровно один раз перед созданием первого экземпляра класса. Базовая концепция «материал, который выполняется ровно один раз» может быть смоделирован на C / C ++ с помощью статической переменной, например:
int some_function(int a, int b)
{
static bool once=true;
if (once)
{
// this code path runs only once in the program's lifetime
once=false;
}
...
}
Однако это не является потокобезопасным . Правильная работа этой функции при наличии нескольких потоков иногда может быть сложной и сложной задачей.
В C ++ существует концепция анонимного пространства имен.
foo.cpp:
namespace {
int x;
int y;
}
для получения того же эффекта в C
foo.cpp:
static int x;
static int y;
Проще говоря, компилятор не экспортирует символы из единицы перевода, если они объявлены статическими или в анонимном пространстве имен.