57 votes

Pourquoi le code appelle-t-il explicitement une méthode statique via un pointeur null?

J'ai vu ce type de code dans un couple de vieux projets:

class Class {
    static void Method() {}
};

((Class*)0)->Method();

Ce code contient un comportement indéfini, car il inclut un déréférencement d'un pointeur null (peu importe ce qui se passe après). Il ne fait pas vraiment de sens - la fonte est là pour nourrir le nom du type le compilateur et celui qui a écrit le code ci-dessus pourrait avoir écrit ceci à la place:

Class::Method();

et ce dernier serait d'accord.

Pourquoi serait-on écrire l'ancien code? Est-il connu de l'idiome de quelques bons vieux jours ou quoi?

67voto

ecatmur Points 64173

Fonctions membres statiques ont été ajoutés en C++, en 1989, dans la Version 2.0 de l'AT&T Langage C++ (Système de pré-normalisation). Avant cela, l' static mot-clé ne peut être utilisée pour déclarer des fonctions de membre statique, de sorte que les auteurs de code utilisé des solutions de contournement, principalement celui que vous avez observé de indirecting un pointeur null.

Dans les valeurs Sélectionnées accompagnant la version 2.0 de l'AT&T C++ Système de la Langue, dans la section 1-22, Stroustrup écrit:

Il a également été observé que les non-compatibles de code, tels que:

((X*)0)->f();

a été utilisé pour simuler les fonctions membres statiques. Ce truc est une bombe à retardement, car tôt ou tard, quelqu'un va faire une f() qui est utilisé de cette façon, virtual et l'appel échouera horriblement car il n'y a pas d' X objet à l'adresse zéro. Même lorsqu' f() n'est pas virtuelle de tels appels échouent dans certaines implémentations de la liaison dynamique.

Votre code a été écrit pour compiler sous Cfront 1.0 ou par quelqu'un qui n'était pas au courant au moment de l'ajout de fonctions membres statiques de la langue.

L'annotation de la fonction de membre avec static est en effet un casse-tête, comme des Acclamations et des hth. - Alf a observé; Cfront 1.0 aurait rejeté ce code:

error:  member Method() cannot be static

il ne peut donc pas avoir été là au départ. Je pense que Potatoswatter est probablement correct; static a été ajouté à une date ultérieure pour documenter et appliquer la méthode statique d'attribut de l' Method, une fois qu'un compilateur C++ 2.0 pourrait être assuré, mais sans le code d'appel en cours de mise à jour. Pour confirmer cela, vous auriez besoin d'interroger l'origine programmeur(s) ou au moins d'examiner de contrôle de la source de l'histoire (s'il existe).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X