外部変数の「宣言」と「定義」の違いがわかりません。

extern int a; // 宣言
int a = 3; // 定義
extern int a = 3; // warningは出るけど定義

記憶クラスを指定しない=外部変数の定義と考えて合ってますか?
(でもstaticはつけても定義だしなぁ……)