It's not strictly legal. int a;
is a tentative definition in C. You are allowed multiple tentative definitions and at most one non-tentative definition per translation unit of each object with external linkage in C, but only one definition across all translation units in a program.
It is a commonly implemented extension to allow tentative definitions across multiple translation units in C so long as not more than one translation unit contains a non-tentative definition, but it's not strictly standard.
In C++ int a;
is just a definition - there's no concept of tentative - and it's still illegal to have multiple definitions of an object across the translation units of a program.
For the C case, you may wish to look at this question.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…