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
Libérer: 2024-12-30 14:15:16
original
544 Les gens l'ont consulté

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
Copier après la connexion

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]).
Copier après la connexion

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);
Copier après la connexion

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>.
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal