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?

Author: sharptooth, 2014-09-08

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ób virtual, A wywołanie zawiedzie okropnie, ponieważ nie ma X 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).

 67
Author: ecatmur,
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