OVH Cloud OVH Cloud

Reinterpret_cast ?

14 réponses
Avatar
Olivier Bruckner
Bonjour,

Je souhaites rendre du code écris en C, compilable par un compilateur
C++ (VC++ 2003).

Au sein d'une fonction j'ai le code suivant:

[...]

// le proto fe G_Alloc
// void G_Alloc(int size);

bot_state_t *bs;

if (!botstates[client])
botstates[client] = G_Alloc(sizeof(bot_state_t));

bs = botstates[client];

[...]

lors de la compilation j'obtiens le message d'erreur suivant:

error C2440: '=' : cannot convert from 'void *' to 'bot_state_t *'
Conversion from 'void*' to pointer to non-'void' requires an
explicit cast

J'utilise donc reinterpret_cast (pointeur sur un pointeur d'un autre
type si je ne me trompe pas) j'écris donc le code suivant:

[...]

bot_state_t *bs;

if (!botstates[client])
botstates[client] =
G_Alloc(sizeof(reinterpret_cast<int*>(bot_state_t))); // je suis sur de
me tromper dans l'écriture...

bs = botstates[client];

[...]


et là j'obtiens ce message d'erreur:

error C2226: syntax error : unexpected type 'bot_state_t'

Je me demande si vous pouvez m'éclairer sur ces convertions C/C++,
pourquoi le compilateur en a t'il besoin ?

Je vous remercie.

4 réponses

1 2
Avatar
Arnaud Meurgues
Fabien LE LEZ wrote:

reinterpret_cast<int*>(G_Alloc(sizeof(bot_state_t)));


Pourquoi pas simplement un static_cast ?

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Fabien LE LEZ
On Wed, 22 Sep 2004 11:21:47 +0200, Arnaud Meurgues
:

Pourquoi pas simplement un static_cast ?


Parce que la question portait sur l'emplacement du cast, pas son type.

--
;-)

Avatar
Gabriel Dos Reis
"mmm" writes:

| Les mécanismes du type dynamic_cast<type> sont de peux d'utilité, autant se
| faire ses propres templates en utilisant une technique simili com (addref,
| release, queryinterface, ... pointeurs observer<>, addrefer<>, ...) y
| compris pour les objets sans ref count (getinterface) qui balance des
| exceptions en cas de pb.
|
| Les cast C je ne les utilise principalement que pour caster de void* <->
| type* et en règle général quand je veux blouser le compilo mais j'évite
| grave, il y a quelque rares cas(pr moi) où static_cast peut se réveler
| indispensable (ex: cast d'une interface particulière/héritage multiple
| basique d'une classe vers un truc style void** pr pas que le compilo
| s'emmèle les pédales, le seul endroit où j'utilise ce type de cast).
| Et l'intérêt du reinterpret_cast j'en vois pas, si ce n'est ce que tu
| disais, le côté "grepable", qui peut être effectivement important, mais les
| cast C à condition d'être "propre" peuvent l'être aussi (bon par type :-)
| mais perso j'ai jamais eu à faire ça et c'est plus du à des carrences de nos
| env de dev).
| Les cast C sont, par contre relativement dangereux, et lorsqu'un peu plus de
| contrôle serait bienvenu, les cast c++ ne me paraissent pas à la hauteur de
| la tâche (ex: si en plus de la longueur de la syntaxe, je dois me taper le
| test du retour pour balancer une exception au cas où la classe demandée
| n'est pasdispo, ben je préfère refaire le truc...;-) ) .

Groumph.

Consulte la liste des bouquins de la FAQ ; prends-en un ; étudie-le
sérieusement. Et essaie d'en retenir quelque chose.

-- Gaby
Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Wed, 22 Sep 2004 04:33:43 +0200, Olivier Bruckner
:

G_Alloc(sizeof(reinterpret_cast<int*>(bot_state_t)));

// je suis sur de me tromper dans l'écriture...


Je confirme.

reinterpret_cast<int*>(G_Alloc(sizeof(bot_state_t)));


Pourquoi reinterpret_cast, et non static_cast ?

(À vrai dire, moi, j'aurais démandé pourquoi G_Alloc et al, plutôt que
std::vector ?)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


1 2