Dlaczego kod miałby jawnie wywoływać statyczną metodę za pomocą wskaźnika null?
Widziałem taki kod w kilku starych projektach:
class Class {
static void Method() {}
};
((Class*)0)->Method();
Ten kod zawiera nieokreślone zachowanie, ponieważ zawiera dereferencję wskaźnika null (bez względu na to, co stanie się później). To naprawdę nie ma sensu - cast jest tam, aby podać nazwę typu kompilatorowi i ktokolwiek napisał powyższy kod mógł napisać to zamiast tego:
Class::Method();
I to drugie byłoby w porządku.
Po co ktoś miałby pisać poprzedni kod? Czy to znany idiom z dawnych dobrych czasów albo co?
1 answers
Statyczne funkcje member zostały dodane do C++ w 1989 roku, w wydaniu 2.0 systemu języka AT&T C++ (pre-standaryzacja). Wcześniej słowo kluczowe static
nie mogło być użyte do deklarowania statycznych funkcji Członkowskich, więc autorzy kodu używali obejść, głównie tych, które zaobserwowałeś, dotyczących indirectingu wskaźnika null.
W wybranych odczytach towarzyszących wersji 2.0 systemu języka C++ AT&T, w sekcji 1-22, Stroustrup pisze:
Zauważono również, że kod niesortowalny, taki jak:
((X*)0)->f();
Był używany do symulacji statycznych funkcji członowych. Ta sztuczka jest bombą zegarową, ponieważ prędzej czy później ktoś zrobi
f()
, który jest używany w ten sposóbvirtual
, A wywołanie zawiedzie okropnie, ponieważ nie maX
obiektu pod adresem zero. Nawet jeśli {[3] } nie jest wirtualne, takie wywołania zawiodą w niektórych implementacjach dynamicznego łączenia.
Twój kod został napisany do kompilacji pod Cfront 1.0 lub przez ktoś, kto nie był świadomy w momencie dodawania statycznych funkcji Członkowskich do języka.
Przypisanie funkcji member z {[2] } jest rzeczywiście zagadką, jak . - Alf zaobserwował; CF 1.0 odrzuciłby ten kod z:
error: member Method() cannot be static
Więc nie może być tam początkowo. Myślę, żePotatoswatter jest najprawdopodobniej poprawny; static
został dodany w późniejszym terminie, aby udokumentować i wyegzekwować atrybut metody statycznej Method
, raz Kompilator C++ 2.0 może być gwarantowany, ale bez aktualizacji kodu wywołującego. Aby to potwierdzić, musisz przeprowadzić wywiad z oryginalnym programistą lub przynajmniej sprawdzić historię kontroli źródeł (jeśli taka istnieje).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 16:36:05