Разница между инициализацией статических переменных в 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
Спасибо за вашу помощь.
Ответы
Ответ 1
Он компилируется в С++, потому что С++ должен поддерживать динамическую инициализацию в любом случае, или вы не можете иметь локальные статические или нелокальные объекты с нетривиальными конструкторами.
Итак, поскольку С++ имеет такую сложность, поддержка этой инициализации, как вы показываете, не сложнее добавить.
В C это было бы большой проблемой, потому что у C нет другой причины поддерживать инициализацию при запуске программы (кроме тривиальной нулевой инициализации). В C исходные значения области видимости файла или локальных статических объектов всегда можно статически помещать в исполняемый образ.
Ответ 2
6.7.8/4 [C99]
Все выражения в инициализаторе для объекта с длительностью статического хранения должны быть константные выражения или строковые литералы.
В static int i = initializer();
RHS не является постоянным выражением, поэтому код не компилируется в C.
В С++ такого ограничения нет, и код хорошо сформирован в С++.
Ответ 3
Статические переменные в C необходимо инициализировать со значением, известным во время компиляции. Это требование было удалено на С++, и вы можете инициализировать их выражениями, оцененными во время выполнения.
Эти два языка различаются и многие, многие другие. Вы можете легко написать код C, который будет приемлемым для компилятора С++, но обратное неверно.