Wpis z mikrobloga

@KrzaQ2: Kod jest 'legalny', ale jego kompilacja to UB. Pozwól że rozwinę: :)

To zastrzeżenie ma konkretny powód: kompilator może mieć swój runtime używany w kompilowanych programach. I tak wszystkie symbole z tego runtime'u zaczynają się od '__'.

Dlatego kod jest 'legal' bo przecież runtime też trzeba czymś skompilować. Przy kompilacji tegoż wg. standardu nadal masz UB, ale w praktyce wiesz czym kompilujesz i jakie nazwy są zarezerwowane.
@user84328: Nie tylko. Niektóre ABI (kiedyś, teraz juƶ chyba nie) uƶywają

__
do manglowania nazw, więc moƶe się okazać, ƶe

a__b
będzie rozumiane przez linker jako

a::b
. Ponadto, standard mówi wyraźnie:

__
jest zarezerwowane dla implementacji, więc o ile nie piszesz biblioteki standardowej to po prostu nie moƶesz tego uƶywać - nie ma ani słowa o tym, ƶe to UB, to jest po prostu zakazane.
a_b jest legalne, nie legalne są ab oraz Ab.

Runtime kompilatora != biblioteka standardowa (a to że mogą siedzieć w jednym pliku .so/.a to inna sprawa).

Przykładowo kompilator musi zaimplementować obsługę wyjątków. Może albo do każdego try/catcha emitować niezbędny kod (masę kodu), albo wyemitować wywołania do funkcji z runtime'u. Czyli runtime musi wyexportować symbol który na pewno nie będzie kolidował z symbolami użytkownika. Do tego używa się __. Czy w takim