atexitが求めているのは関数ポインタだけなのでextern "C" はそもそも必要ない

extern "C" は関数の内部名をC言語形式(func()→_func)で扱うか、
C++形式で扱うか(func()→_Z3funcv、引数の型によって名前が変わる)だけの違い

namespaceとの相互作用は知らん