Disons que j'ai le code (très simple) ci-dessous.
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Cela compile bien sur g ++ et clang; cependant, il ne parvient pas à compiler sur MSVC avec l'erreur suivante:
erreur C2039: 'stoi': n'est pas membre de 'std'
erreur C3861: 'stoi': identifiant introuvable
Je sais que cela std::stoifait partie de l'en- <string>tête, que les deux anciens compilateurs incluent sans doute comme faisant partie de <iostream>ce dernier et non. Selon la norme C ++ [res.on.headers]
Un en-tête C ++ peut inclure d'autres en-têtes C ++.
Ce qui, pour moi, dit essentiellement que les trois compilateurs sont corrects.
Ce problème est survenu lorsqu'un de mes étudiants a soumis un travail, que l'AT a marqué comme ne compilant pas; Bien sûr, je suis allé le réparer. Cependant, je voudrais éviter de futurs incidents comme celui-ci. Alors, existe-t-il un moyen de déterminer quels fichiers d'en-tête doivent être inclus, à moins de compiler sur trois compilateurs différents pour vérifier à chaque fois?
La seule façon dont je peux penser est de s'assurer que pour chaque stdappel de fonction, une inclusion appropriée existe; mais si vous avez un code existant qui fait des milliers de lignes, cela peut être fastidieux à parcourir. Existe-t-il un moyen plus facile / meilleur d'assurer la compatibilité entre les compilateurs?
Exemple avec les trois compilateurs: https://godbolt.org/z/kJhS6U
std::stoi, vous vous assurez immédiatement qu'il #include <string>est également présent.
std::stoic'est pour la gestion des chaînes, vous pourriez deviner que ce<string>serait un bon en-tête à inclure. Ou vous pouvez rechercher une bonne référence qui vous le dira. Et je vous recommande de toujours inclure explicitement les fichiers d'en-tête, de sorte que vous n'ayez pas à vous fier à un comportement spécifique à l'implémentation non portable.