A definition allocates storage for a variable and can only appear once in a program. A declaration (like 'extern int x;') only informs the compiler about the type and can appear multiple times across different files or scopes. This is why header files can contain declarations without causing multiple definition errors.