Цитата(MrYuran @ Nov 28 2014, 12:42)

..если объявить в разных файлах - два, на которые потом ругается линкер.
Он может и не ругаться (во всяком случае по стандарту).
Более того он выделит под переменные из разных файлов с одинаковым именем общую память.
И можно очень весело проводить время, отлаживая проект из двух файлов, скажем такого содержания.
Код
int a;
и
Код
char a;
Именно для этого случая Си и предоставляет инструмент в виде ключевого слова
static.
И если глобальная переменная внутри модуля не представлена в его интерфейсе (в заголовочном файле как extern), то она обязана иметь квалификатор
static.
Всё остальное - просто неграмотно.
Цитата(ViKo @ Nov 28 2014, 12:53)

Keil такого не принимает.
Естественно. Более того и для gcc это является атавизмом после появления ключика -flto.