10
votes

Est-ce que "Const LPVoid" équivalent à "Void * Const"?

et si oui, pourquoi certains en-têtes Win32 l'utilisent?

Par exemple: xxx

Un peu plus d'élaboration: si l'API n'utilise jamais de références (ni d'autres C ++ - construit uniquement) mais seulement les pointeurs et les valeurs, quel est le point d'avoir const vs. code> lpcvoid .

devrais-je traiter chaque endroit où je Voir const LPVoid comme un endroit où le sens réel est lpcvoid ? (et donc il est sûr d'ajouter une fonte)

Clarification supplémentaire: il apparaît que const LPVoid pBlock était en effet une erreur dans ce cas. Windows 2008 SDK le remplace à LPCVoid dans verquéryvalue Signature. Le vin l'a fait il y a un peu de temps.


4 commentaires

J'ai entendu dire qu'ils #define 'sont ces choses, donc il préférerait être const void * . S'ils sont typées, ce serait vide * const en effet.


@LitB: Malheureusement, ce sont des typées


@Efraïm, ah je vois. Majuscule maudite :)


Euh, il semble que tu as raison. Vous devriez l'ajouter comme une réponse.


4 Réponses :


1
votes

13
votes

Un nom TypeDEF indique un type et non une séquence de jetons (comme une macro). Dans votre cas, LPVoid désigne le type désigné également par la séquence de jeton vide * . Donc, le diagramme ressemble à xxx

sémantique si vous spécifiez le type const LPVoid , vous obtenez le diagramme suivant (les supports autour des spécificateurs signifie "le type désigné par le spécificateur"): xxx

c'est pas la même chose que la séquence de jeton const Void * - parce que celui-ci ne désignerait pas un type de pointeur qualifié Cons, mais plutôt un pointeur sur un type qualifié de const (la chose pointue serait constituée).

syntaxiquement a La déclaration de paramètre a le formulaire suivant (simplifié): xxx

Les spécificateurs de déclaration en cas de const void * p sont const void < / Code> - de sorte que le type de base de * p est un code qualifié annulé , mais le pointeur lui-même n'est pas qualifié. En cas de const LPVoid P Cependant, les spécificateurs de déclaration spécifient un const qualifié LPVoid - ce qui signifie que le type de pointeur est qualifié, ce qui rend la déclaration de paramètre identique à vide * const p .


9 commentaires

Attends, maintenant je suis confus. Const Void * et Void * const ne sont pas les mêmes.


@Efraïm, la boîte autour de void * signifie qu'il s'agit du type indiqué par LPVoid - cela ne signifie pas que le texte apparaît dans la déclaration.


Ah, d'accord, ce diagramme m'a juste rendu confus.


Il est similaire à la fonction pointeur de la fonction. Bien que vous ne puissiez pas écrire void (*) () () p; vous pouvez effectivement écrire typedef vide (* f) (); f p; . C'est [void (*) ()] p; ici.


int Const et const int sont en fait deux choses différentes, une constante INT signifie qu'une fois la valeur qui est attribuée, vous ne pouvez pas la modifier et est constante en d'autres termes, l'adresse d'un const est fixe. ATTENDU QUE un const int est une valeur lisonnante et ne peut pas être modifiée. IIRC il y a une mention approfondie à ce sujet dans la programmation d'expert C de Pierre van der Linden.


@ Tommieb75: Cela ressemble beaucoup à celui de quelqu'un s'est mélangé avec des finales Java.


Édité le diagramme pour faire plus clairement la nature immatérielle de ces entités.


tommieb75: const int et int const est 100% identique en C et C ++, juste comme const int * et int const * < / code>.


Je le vois comme ceci: un "nombre constant" est identique à une "constante de nombre", et un "pointeur à un nombre constant" est identique à un "pointeur à une constante de nombres", mais ce n'est pas la même chose qu'un "Pointeur constant à un nombre" ou un "pointeur constant à un nombre". (Les deux derniers sont les mêmes, cependant).



0
votes

LPVoid est un pointeur de loin générique, qui est déjà long de la même manière que le pointeur générique normal (c'était différent des anciennes plates-formes 16 bits).


1 commentaires

Ce qui est correct, cependant a peu à voir avec le sujet de la question.



0
votes
void* const x = 0;
x = 0; // this line will not compile - u cannot change x, only what it points to
x->NonConstMethod(); // will compile
const void* y = 0;
y = 0; // this line will compile - u can change y, but not what it points to
y->NonConstMethod(); // will not compile
const void* const z = 0; // u cannot change z or what it points to
// btw, the type of the 'this' pointer is "ClassName* const this;"

0 commentaires