Maison >développement back-end >C++ >Puis-je prendre l'adresse d'une fonction de bibliothèque standard en C 20 ?

Puis-je prendre l'adresse d'une fonction de bibliothèque standard en C 20 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-30 14:15:16551parcourir

Can I Take the Address of a Standard Library Function in C  20?

Puis-je prendre l'adresse d'une fonction définie dans la bibliothèque standard ?

Introduction

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.

Question

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?

Réponse

Non.

Explication

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.

Le premier appel

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);

Le deuxième appel

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.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn