В режиме компиляции С++ и без extern если программист вынудит компилятор таки завести переменные - он заводит их статическими уровня файла (по кр. мере gcc), поэтому линкеру не на что ругаться. Если режим компиляции С или если указано extern - заводятся глобальные и линкер ругается.