Разница между инициализацией статических переменных в C и C ++ - PullRequest
20 голосов
/ 07 мая 2011

Я просматривал код на 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 ().Это хорошо.Но этот код прекрасно компилируется в компиляторе C ++.

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

Я искал этот вопрос на SO, нашел 3 аналогичные ссылки, но тщетно. Ссылка1 Ссылка2 Ссылка3

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

Ответы [ 3 ]

10 голосов
/ 07 мая 2011

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

Так что, поскольку C ++ в любом случае имеет такую ​​сложность, поддержка инициализации, которую вы демонстрируете, больше не сложна для добавления.

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

7 голосов
/ 07 мая 2011

6,7,8 / 4 [C99]

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

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

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

3 голосов
/ 07 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...