En travaillant avec C , vous vous demandez peut-être si vous pouvez obtenir l'adresse d'une fonction résidant dans la bibliothèque standard. Cette question est pertinente, car elle peut avoir un impact sur l'utilisation de ces fonctions dans divers scénarios.
Dans l'extrait de code suivant, deux appels à std::invoke sont effectués :
std::invoke(std::boolalpha, std::cout); // #1 std::cout << std::invoke(static_cast<ctype_func>(std::tolower), 'A') << '\n'; // #2
La sortie attendue de ce code est-elle garantie en C 20?
Non.
Le comportement des programmes C est explicitement indéfini lorsqu'on tente de former un pointeur vers un standard fonction de bibliothèque, sauf si cette fonction a été explicitement désignée comme fonction adressable. Ceci est indiqué dans [namespace.std] du standard C.
Dans le premier appel à std::invoke, nous essayons d'obtenir un pointeur vers std::boolalpha . Heureusement, [fmtflags.manip] vient à notre secours :
Each function specified in this subclause is a designated addressable function ([namespace.std]).
std::boolalpha est bien une fonction spécifiée dans ce sous-paragraphe, rendant cette ligne bien formée et équivalente à :
std::cout.setf(std::ios_base::boolalpha);
Malheureusement, pour le deuxième appel, [cctype.syn] informe us:
The contents and meaning of the header <cctype> are the same as the C standard library header <ctype.h>.
Nulle part dans cet en-tête de bibliothèque standard std::tolower n'est explicitement désigné comme fonction adressable. Par conséquent, le comportement de ce programme C n'est pas défini, ce qui peut entraîner une erreur de compilation.
Le résultat attendu de ce code n'est pas garanti et le code peut même ne pas se compiler correctement en raison au comportement indéfini associé à la prise de l'adresse de std::tolower.
De plus, cela s'applique non seulement aux fonctions de bibliothèque standard mais également aux fonctions membres déclarées dans la bibliothèque standard C. Prendre l'adresse de ces fonctions membres entraîne également un comportement indéfini.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!