In C++ bereik je iha hetzelfde door de functies in een anonymous namespace te declareren/defineren. Je wilt gewoon nooit losse (private) functies met external linkage hebben. External linkage betekent dat het item zichtbaar is buiten de module die je compileert "module public". Internal linkage daarentegen is niet zichtbaar, en dus "module private". Een statische class member in C++ heeft wel external linkage, maar een namespace scope statisch item heeft internal linkage. Ook alle items (statisch of niet) hebben internal linkage in een anonymous namespace. De exacte regels zijn iets uitgebreider (local classes, enums, etc) maar dat is het basis idee.
Het nadeel van een namespace scope non-static functie is dus dat het niet geencapsuleerd is. Als je het bij een class levert is het hetzelfde als een public member die dat niet moet zijn. (want alles dat bij een class module wordt geleverd behoort ook tot die class)
In C++ is het juist niet zo'n groot probleem vanwege namespaces en classes; daar zal je niet zo snel een name clash hebben. In C is het juist een groot probleem. Hoeveel functies max() en min() zijn er wel niet... Als iedereen die met external linkage defineert dan compiled er nooit iets. Vandaar dat je opmerking over het begrijpen van de nadelen in C++ maar niet in C niet helemaal klopt... juist in C is er een groot nadeel, in C++ kan je dit afvangen door goed gebruik van namespaces (of eventueel anonymous namespaces om het hele 'probleem' te omzeilen, zoals gebruikelijk)