Я бы сказал, что второе использование довольно редко, по крайней мере, в коде, который я видел до сих пор (и я видел довольно много C ++ кода). Не могли бы вы объяснить причины второго метода?
Обычно вы будете использовать анонимное пространство имен в файле реализации C ++ для достижения того же, что и «static», сделавшего в C (или C ++, но мы его замаскируем), а именно, ограничение видимости символов до текущий переводческий блок. На самом деле typedef не создает символы, которые экспортируются для компоновщика, так как они не создают ничего «конкретного» в смысле чего-то конкретного, с чем вы можете связать.
Моя рекомендация? Я бы пошел с первой записью. Второй добавляет ненужные осложнения и, на мой взгляд, ничего вам не дает.