extern float kFloat;
declares kFloat
without defining it.
but:
float kFloat;
also declares kFloat
but is a tentative definition of kFloat
.
Adding extern
just suppresses the tentative definition. In a header file you only want declarations, not definitions.
If the tentative definition is included in several source files, you will end up having multiple definitions of the same object which is undefined behavior in C.