Что такое статический блок в c или C++? [дубликат]

10
задан einpoklum - reinstate Monica 17 April 2017 в 06:41
поделиться

3 ответа

Другой альтернативой является то, что вы можете искать аналогию со статическим блок в Java. Блок кода, который запускается при загрузке приложения. В C ++ такого нет, но его можно подделать с помощью конструктора статический объект.

foo.cpp:

struct StaticBlock {
    StaticBlock(){
        cout << "hello" << endl;
    }
}


static StaticBlock staticBlock;

void main(int, char * args[]){

}

ОДНАКО. Меня это уже укусило, так как это тонкий крайний случай C ++ стандарт. Если статический объект недоступен для какого-либо кода, вызываемого основным, конструктор статического объекта может вызываться или не вызываться.

Я обнаружил, что с помощью gcc вывод hello будет выводиться, а с помощью Visual Studio - нет.

30
ответ дан 3 December 2019 в 13:21
поделиться

В 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; 
 } 
 ...
}

Однако это не является потокобезопасным . Правильная работа этой функции при наличии нескольких потоков иногда может быть сложной и сложной задачей.

5
ответ дан 3 December 2019 в 13:21
поделиться

В C ++ существует концепция анонимного пространства имен.

foo.cpp:

namespace {
    int x;
    int y;
}

для получения того же эффекта в C

foo.cpp:

static int x;
static int y;

Проще говоря, компилятор не экспортирует символы из единицы перевода, если они объявлены статическими или в анонимном пространстве имен.

1
ответ дан 3 December 2019 в 13:21
поделиться