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