Au risque de me voir attribuer un autre badge de Nécromancien, je voudrais ajouter une très bonne utilisation pour uintptr_t
(ou même intptr_t
) et c'est l'écriture de code embarqué testable.
J'écris principalement du code embarqué destiné à divers processeurs arm et actuellement tensilica. Ceux-ci ont différentes largeurs de bus natifs et le tensilica est en fait une architecture Harvard avec des bus de code et de données séparés qui peuvent être de largeurs différentes.
J'utilise un style de développement piloté par les tests pour une grande partie de mon code, ce qui signifie que je réalise des tests unitaires pour toutes les unités de code que j'écris. Les tests unitaires sur le matériel cible réel sont une corvée, donc j'écris généralement tout sur un PC basé sur Intel, soit sous Windows, soit sous Linux en utilisant Ceedling et GCC.
Ceci étant dit, une grande partie du code embarqué implique des manipulations de bits et d'adresses. La plupart de mes machines Intel sont en 64 bits. Donc si vous voulez tester un code de manipulation d'adresse, vous avez besoin d'un objet généralisé sur lequel faire des calculs. Ainsi le uintptr_t
vous offrent un moyen indépendant de la machine pour déboguer votre code avant d'essayer de le déployer sur le matériel cible.
Un autre problème est que pour certaines machines ou même certains modèles de mémoire sur certains compilateurs, les pointeurs de fonctions et les pointeurs de données ont des largeurs différentes. Sur ces machines, le compilateur peut même ne pas autoriser le casting entre les deux classes, mais uintptr_t
devrait être capable de tenir l'un ou l'autre.
-- Editer --
Cela a été signalé par @chux, cela ne fait pas partie de la norme et les fonctions ne sont pas des objets en C. Cependant, cela fonctionne généralement et comme beaucoup de gens ne connaissent pas ces types, je laisse généralement un commentaire expliquant la ruse. Autres recherches dans SO on uintptr_t
fournira des explications supplémentaires. De plus, nous faisons des choses dans les tests unitaires que nous ne ferions jamais en production, car il est bon de casser les choses.
6 votes
Des détails supplémentaires sur ce type ainsi que sur d'autres types apparentés sont disponibles ici : opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html
2 votes
fr.cppreference.com/w/cpp/types/integer listes
std::uintptr_t
ystd::intptr_t
une option C++11.