Programmiersprache C++26: Vereinfachter Umgang mit Pointer-Adressen

Die Anzeige der Adresse eines beliebigen Zeigers in C++ 20 schlägt fehl, ist aber mit C++26 erfolgreich.

vorlesen Druckansicht 1 Kommentar lesen

(Bild: Piyawat Nandeenopparit / Shutterstock.com)

Lesezeit: 2 Min.
Von
  • Rainer Grimm
Inhaltsverzeichnis

Mit C++26 ist es möglich, die Adresse eines beliebigen Zeigers auszugeben.

Modernes C++ – Rainer Grimm
Rainer Grimm

Rainer Grimm ist seit vielen Jahren als Softwarearchitekt, Team- und Schulungsleiter tätig. Er schreibt gerne Artikel zu den Programmiersprachen C++, Python und Haskell, spricht aber auch gerne und häufig auf Fachkonferenzen. Auf seinem Blog Modernes C++ beschäftigt er sich intensiv mit seiner Leidenschaft C++.

Nur die Zeigertypen void, const void und std::nullptr_t sind gültig. Wer die Adresse eines beliebigen Zeigers anzeigen möchte, muss ihn in (const) void* umwandeln.

// formatPointer20.cpp

#include <format>
#include <iostream>
#include <string>

int main() {

  double d = 123.456789;

  //std::cout << "&d" << std::format("{}", &d) << '\n';  
  std::cout << "static_cast<void *>(&d): " << std::format("{}", static_cast<void *>(&d)) << '\n';     
  std::cout << "static_cast<const void *>(&d): " << std::format("{}", static_cast<const void *>(&d)) << '\n'; 
  std::cout << "nullptr: " << std::format("{}", nullptr) << '\n';           
             
}

In der main-Funktion wird eine double-Variable namens d mit dem Wert 123,456789 initialisiert. Die Funktion std::format stellt die Adresse dar.

In der ersten auskommentierten Zeile wird versucht, die Adresse von d direkt mit std::format(„{}“, &d) auszugeben. Diese Zeile ist auskommentiert, weil sie zu einem Kompilierungsfehler führen würde. Die Funktion std::format erfordert, dass der Zeiger in void* oder const void* umgewandelt wird, um ihn korrekt zu formatieren.

Die nächsten drei Zeilen zeigen, wie Zeiger mit std::format korrekt formatiert und ausgegeben werden. In der ersten dieser Zeilen wird die Adresse von d nach der Umwandlung in void* ausgegeben. In der zweiten Zeile wird die Adresse von d nach der Umwandlung in const void* ausgegeben. In der dritten Zeile wird der Wert nullptr ausgegeben, der einen Null-Zeiger darstellt.

Hier ist die Ausgabe des Programms:

Bei Aktivierung der auskommentierten Zeile erscheint eine lange Fehlermeldung.

Mit C++26 kann man den Zeiger direkt ausgeben:

// formatPointer26.cpp

#include <format>
#include <iostream>
#include <string>

int main() {

  double d = 123.456789;
  double* p = &d;

  std::cout << "&d" << std::format("{:P}", p) << '\n';  
 
}

Offen gestanden lässt sich das Programm nicht kompilieren. Dies widerspricht der Compiler-Unterstützung für C++26 und dem Proposal P2510R3. Warum das so ist, verrate ich in meinem nächsten Beitrag.

Concurrency wird mit C++26 zwei nette Features fĂĽr Lock-freie Datenstrukturen erhalten: Read-Copy Update und Hazard Pointers. (rme)