2015-05-26 2 views
9

я написал кусок кода, как этотКак GCC обрабатывать переменное переопределение

int a; 
int a = 100; 
int main() 
{ 
} 

Он был успешно составлен GCC, но не G ++.

Я думаю, что GCC справится с этим, игнорируя первое определение переменной a. Но я хочу знать точное правило, чтобы я ничего не пропустил.

Может ли кто-нибудь помочь мне?

+0

Не следует: вы должны использовать 'int main (void)'. Вы также должны скомпилировать с помощью '-Wall' – Eregrith

+5

Это не вопрос gcc против g ++, это вопрос C по сравнению с C++. Различные языки, разные правила. – Mat

+0

@Eregrith Я добавляю -Wall и gcc только напоминаю мне, что нет возврата в основной функции – delphifirst

ответ

10

В C

int a; /* Tentative definition */ 
int a = 100; /* Definition */ 

От 6.9.2 внешних определений объектов в спецификации C11:

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

int i4; // tentative definition, external linkage 
static int i5; // tentative definition, internal linkage 

в C++

int a; - это определение (не предварительное), а также потому, что оно не допускает множественных определений объекта, оно не будет скомпилировано.

+0

Большое спасибо , Правило кажется сложным. Почему C имеет немного запутанную функцию? Можете ли вы привести пример, где мы должны его использовать? – delphifirst

+0

Я помню дискуссию о том, какие предварительные определения хороши, и мы пришли к выводу без какого-либо хорошего использования. Поэтому я не знаю хорошего обоснования. –

Смежные вопросы