-
[casting] C vs C++
hello,
pourriez vous me dire dans quel cas j ai plustot interet à utiliser plustot que le cast C standard Contrairement au dynamic, static et cont cast, la :faq: (10.2.4) ne donne pas les point de comparaison avec le C standard.
merci d avance.
-
Salut,
L'opérateur reinterpret_cast permet de convertir par exemple:
- Un pointeur vers n'importe quel type d'entier de taille suffisante
- Une valeur de type entier ou enum vers un pointeur
- Un pointeur de fonction vers un pointeur sur une fonction de type différent
- Un pointeur sur un objet vers un pointeur sur un objet de type différent
reinterpret_cast ne peut toutefois pas modifier le qualificatif de constance ou de volatilité d'une variable.
Thierry
-
Citation:
Envoyé par mujigka
- Un pointeur vers n'importe quel type d'entier de taille suffisante
- Une valeur de type entier ou enum vers un pointeur
- Un pointeur de fonction vers un pointeur sur une fonction de type différent
- Un pointeur sur un objet vers un pointeur sur un objet de type différent
ok, mais ca ne repond pas a ma question, car il me semble que c est realisable avec le cast C standard !?
-
Ce qu'il faut savoir, c'est que dans tous les cas (sauf peut-être pointeur de fonction <--> void*, et dynamic_cast qui n'est pas un cast ordinaire), tout est réalisable avec le cast C. Et c'est justement la raison pour laquelle il ne faut l'utiliser sous aucun prétexte.
Donc, il faut utiliser le cast le plus restrictif possible selon la situation: static_cast<>, reinterpret_cast<>, const_cast<>.
-
ok, cool, je vais faire evoluer mon code vers des cast c++.
Mais y a t il une methode de recherche pour les trouver (syntaxiquement bien sur). Car avec les milliers de lignes de code ca va etre chaud. En tout cas je ne vois pas de moyens simple de les trouver...
-
En effet, il n'y en a pas (à part peut-être jouer avec la grammaire du compilateur), alors que les casts C++ sont tous aisément détectables. Raison de plus pour y penser dès l'écriture du code...
-
J'ai vu des casts souvent utilisés alors qu'en fait aucun cast n'était nécessaire.
Il faut laisser faire les conversions implicites si possible.
Ensuite si tu veux downcaster un objet polymorphe ou convertir un pointeur void vers un autre type de pointeur, utilise static_cast<>.
Si tu veux downcaster un objet polymorphe et faire une vérification à l'éxecution qu'il s'agit bien du bon type, utilise dynamic_cast<>.
Si tu veux convertir un pointeur vers un autre type de pointeur incompatible, utilise reinterpret_cast<>.
Si tu veux enlever le const dans un pointeur, utilise const_cast<>.