Bei der Arbeit mit C fragen Sie sich vielleicht, ob Sie das können Rufen Sie die Adresse einer Funktion ab, die sich in der Standardbibliothek befindet. Diese Frage ist relevant, da sie sich auf die Nutzung dieser Funktionen in verschiedenen Szenarien auswirken kann.
Im folgenden Codeausschnitt werden zwei Aufrufe von std::invoke durchgeführt:
std::invoke(std::boolalpha, std::cout); // #1 std::cout << std::invoke(static_cast<ctype_func>(std::tolower), 'A') << '\n'; // #2
Ist die erwartete Ausgabe dieses Codes in C garantiert? 20?
Nein.
Das Verhalten von C-Programmen ist explizit undefiniert, wenn versucht wird, einen Zeiger auf einen Standard zu bilden Bibliotheksfunktion, es sei denn, diese Funktion wurde ausdrücklich als adressierbare Funktion bezeichnet. Dies ist in [namespace.std] des C-Standards angegeben.
Im ersten Aufruf von std::invoke versuchen wir, einen Zeiger auf std::boolalpha zu erhalten . Glücklicherweise kommt [fmtflags.manip] zu unserer Rettung:
Each function specified in this subclause is a designated addressable function ([namespace.std]).
std::boolalpha ist tatsächlich eine in diesem Unterabschnitt angegebene Funktion, wodurch diese Zeile wohlgeformt und äquivalent zu:
std::cout.setf(std::ios_base::boolalpha);
Leider informiert [cctype.syn] für den zweiten Aufruf us:
The contents and meaning of the header <cctype> are the same as the C standard library header <ctype.h>.
Nirgendwo in diesem Standardbibliotheksheader ist std::tolower explizit als adressierbare Funktion gekennzeichnet. Daher ist das Verhalten dieses C-Programms undefiniert, was möglicherweise zu einem Kompilierungsfehler führt.
Die erwartete Ausgabe dieses Codes ist nicht garantiert und der Code wird möglicherweise nicht einmal erfolgreich kompiliert auf das undefinierte Verhalten, das mit der Übernahme der Adresse von std::tolower verbunden ist.
Darüber hinaus gilt dies nicht nur für Standardbibliotheksfunktionen, sondern auch für Mitgliedsfunktionen, die in der C-Standardbibliothek deklariert sind. Die Übernahme der Adresse solcher Mitgliedsfunktionen führt ebenfalls zu undefiniertem Verhalten.
Das obige ist der detaillierte Inhalt vonKann ich die Adresse einer Standardbibliotheksfunktion in C 20 übernehmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!