Хотя ваш код содержит ряд довольно серьезных и очевидных ошибок (уже рассмотренных в других ответах), предупреждение, которое вы вводите в заголовок вашего вопроса, является совершенно лишним бессмысленным предупреждением.Компилятор GCC известен тем, что выдает бесполезные предупреждения.Многие из этих предупреждений, похоже, происходят от чьей-то некомпетентной и совершенно необоснованной веры в то, что что-то делать как-то «неправильно», хотя в действительности в этом нет ничего плохого.
В вашем случае предупреждение вызывается
extern int stack_counter = 0;
декларация.По-видимому, «автор» предупреждения полагал, что спецификатор extern
должен быть зарезервирован для неопределяемых объявлений.В этом случае наличие инициализатора = 0
превращает объявление в определение (и, таким образом, формально делает это extern
необязательным).Тем не менее, в этом нет ошибки, и, на самом деле, extern
было бы весьма кстати, чтобы подчеркнуть тот факт, что stack_counter
предназначен для глобальной переменной.
Опять же, нужна ли вам глобальная переменнаяЗдесь или нет другой вопрос, и, опять же, ваш код содержит огромное количество других ошибок.Но предупреждение, на котором вы, кажется, сосредоточили свое внимание, не стоит того.Просто отключите это предупреждение в настройках компилятора (и, пожалуйста, напишите грубое письмо об этом команде GCC).