Conversions de pointeur C/C++
Les compilateurs IBM® C et C++ convertissent les pointeurs avec l'attribut __ptr128 en un pointeur avec l'attribut __ptr64 (et vice versa) selon les besoins, en fonction des déclarations de fonction et de variable.
Tenez compte des éléments suivants :
- Un pointeur avec l'attribut
_ptr128qui pointe vers le stockage SLS (Single-Level Store) est converti en un pointeur avec l'attribut__ptr64. - Le code qui n'est pas activé pour l'espace mémoire à téraoctets ne peut pas accéder à l'espace mémoire à téraoctets.
- Les interfaces avec des paramètres de pointeur à pointeur nécessitent un traitement spécial. Voir maintien de déclarations d'arguments cohérentes.
Les compilateurs ILE insèrent automatiquement des conversions de pointeur pour correspondre aux longueurs de pointeur. Dans le cas de pointeurs à plusieurs niveaux, la conversion est effectuée uniquement sur le premier niveau du pointeur. Par exemple, les conversions sont insérées chaque fois que:
- Les arguments de pointeur d'une fonction ne correspondent pas à la longueur des paramètres de pointeur dans le prototype de la fonction
- Les pointeurs de différentes longueurs sont comparés
Remarque: Vous pouvez spécifier des conversions de pointeur explicites. Voir Casting Pointers.
Lors du transtypage de pointeurs dans un environnement à téraoctets, tenez compte des points suivants:
- Une conversion d'un pointeur de 16 octets en un pointeur de 8 octets ne fonctionne que si le pointeur de 16 octets contient une adresse d'espace mémoire à téraoctets ou une valeur de pointeur nulle. Sinon, une condition d'exception MCH0609 se produit ou une valeur de décalage d'espace mémoire à téraoctets arbitraire est renvoyée.
- Les pointeurs de 16 octets ne peuvent pas avoir de types convertis de l'un à l'autre, mais un pointeur ouvert de 16 octets peut contenir n'importe quel type de pointeur. En revanche, il n'existe pas de pointeur d'ouverture de 8 octets, mais les pointeurs de 8 octets peuvent être convertis logiquement entre un pointeur d'espace et un pointeur de procédure. Même ainsi, une conversion de pointeur de 8 octets n'est qu'une vue du type de pointeur, de sorte qu'elle ne permet pas à un pointeur de l'espace d'être réellement utilisé comme pointeur de procédure à moins que le pointeur de l'espace ait été positionné pour pointer vers une procédure.