Подтвердить что ты не робот

Разница между инициализацией статических переменных в C и С++

Я просматривал код http://geeksforgeeks.org/?p=10302

#include<stdio.h>
int initializer(void)
{
    return 50;
}

int main()
{
    static int i = initializer();
    printf(" value of i = %d", i);
    getchar();
    return 0;
}

Этот код не будет компилироваться в C, потому что статические переменные должны быть инициализированы перед запуском main(). Это нормально. Но этот код будет компилироваться просто отлично в компиляторе С++.

Мой вопрос заключается в том, почему он компилируется в компиляторе С++, когда статический язык имеет одинаковое использование на обоих языках. Конечно, компиляторы будут отличаться для этих языков, но я не могу точно указать причину. Если это указано в стандарте, я хотел бы это знать.

Я искал этот вопрос на SO, нашел 3 похожих ссылки, но напрасно. Link1 Ссылка2 Link3

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Он компилируется в С++, потому что С++ должен поддерживать динамическую инициализацию в любом случае, или вы не можете иметь локальные статические или нелокальные объекты с нетривиальными конструкторами.

Итак, поскольку С++ имеет такую ​​сложность, поддержка этой инициализации, как вы показываете, не сложнее добавить.

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

Ответ 2

6.7.8/4 [C99]

Все выражения в инициализаторе для объекта с длительностью статического хранения должны быть константные выражения или строковые литералы.

В static int i = initializer(); RHS не является постоянным выражением, поэтому код не компилируется в C.

В С++ такого ограничения нет, и код хорошо сформирован в С++.

Ответ 3

Статические переменные в C необходимо инициализировать со значением, известным во время компиляции. Это требование было удалено на С++, и вы можете инициализировать их выражениями, оцененными во время выполнения.

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