дубликаты внешних статических объявлений не разрешены в визуальной студии? - PullRequest
3 голосов
/ 16 ноября 2011

Я изучал концепцию объявления и определения (связь, область действия, продолжительность).

Но я обнаружил одну необъяснимую ошибку:

Следующий код подходит как для gcc, так и для Visual Studio2010

#include <stdio.h>

extern int a = 7;
extern int a;

int main()
{
    printf("%d\n", a);
}

Но следующий код генерирует ошибку в visual studio, но в gcc это нормально:

#include <stdio.h>

static int a = 7;
static int a;

int main()
{
    printf("%d\n", a);
}

error C2370: 'a' : redefinition; different storage class

Это просто ошибка в компиляторе Visual Studio?

РЕДАКТИРОВАТЬ: этот вопрос оказался дубликатом это .

1 Ответ

4 голосов
/ 16 ноября 2011

static int a; само по себе без инициализатора является «предварительным определением», поэтому оно должно быть в порядке.Похоже, у Microsoft есть какое-то расширение, которое вас ловит.

Правка - это похоже на проблему Microsoft.Проверьте этот связанный вопрос .Сама спецификация C довольно ясна, что ваш код в порядке.От 6.9.2 Определения внешних объектов :

Объявление идентификатора для объекта, который имеет область действия файла без инициализатора и без спецификатора класса хранения или с хранилищемспецификатор класса static, составляет предварительное определение .Если модуль перевода содержит одно или несколько предварительных определений для идентификатора, а модуль перевода не содержит внешнего определения для этого идентификатора, то поведение точно такое, как если бы модуль перевода содержал объявление области файла для этого идентификатора с составным типом какконца блока перевода, с инициализатором, равным 0.

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