Accidentellement, je l'ai écrit l'extrait suivant intéressant:comportement bizarre avec une manuelle programmée strlen
#include <iostream>
#include <cstring>
size_t strlen(const char* str) {
std::cout << "hello";
return 0;
}
int main() {
return std::strlen("sdf");
}
De façon inattendue pour moi, la sortie est « bonjour » dans GCC 5.1, ce qui signifie que mon strlen
est appelé. Encore plus intéressant, si je supprime le return
, c'est-à-dire remplacez principal avec juste un appel de std::strlen("sdf");
, rien ne s'imprime!
J'ai aussi essayé Clang, pour lequel std::strlen
appelle la fonction réelle qui calcule la longueur de la chaîne (et rien ne s'imprime). C'est ce que je m'attendais à voir.
Comment cela peut-il être expliqué? La définition de ma propre fonction strlen
est-elle considérée comme un comportement non défini?
Voir [noms réservés] et [depr.c.headers]. –
Sur ma machine, votre exemple se sépare. (linux, gcc-version 6.2.1 20160830) Je ne m'attendais pas à ça. Je m'attendais à ce que le code imprime "bonjour" et quitte avec le code 0 au système d'exploitation. – DusteD
Je reçois aussi un segfault avec votre exemple (gcc 5.4). Je suggérerais qu'il est extrêmement inhabituel et «risqué» de fournir une fonction 'strlen' dans l'espace de noms global, car cela surchargerait la version libc (avec le lien« C ») si vous avez inclus' 'd'abord, puisque naturellement outrepassent 'std :: strlen', qui peut être utilisé ailleurs dans la bibliothèque. Par exemple. 'std :: cout' semble générer un appel à' strlen'. –
davmac