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::stoi
fait 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 std
appel 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
c'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.std::stoi
, vous vous assurez immédiatement qu'il#include <string>
est également présent.Réponses:
Cela va toujours être un peu une corvée si vous avez une énorme base de code et que vous ne l'avez pas fait jusqu'à présent, mais une fois que vous avez terminé la correction de vos inclusions, vous pouvez vous en tenir à une procédure simple:
Lorsque vous écrivez un nouveau code qui utilise une fonctionnalité standard, comme
std::stoi
, branchez ce nom dans Google, accédez à l'article cppreference.com, puis regardez en haut pour voir dans quel en-tête il est défini.Incluez-le ensuite, s'il n'est pas déjà inclus. Travail accompli!
(Vous pouvez utiliser la norme pour cela, mais ce n'est pas aussi accessible.)
Ne soyez pas tenté de tout renvoyer au profit de hacks bon marché et non portables comme
<bits/stdc++.h>
!tl; dr: documentation
la source
En plus d'examiner la documentation et de le faire manuellement (douloureux et long), vous pouvez utiliser certains outils qui peuvent le faire pour vous.
Vous pouvez utiliser ReSharper dans Visual Studio qui est capable d'organiser les importations (en fait VS sans ReSharper n'est pas très utilisable). Si include est manquant, il est recommandé de l'ajouter et s'il s'agit d'une ligne obsolète avec include, elle apparaît dans des couleurs plus pâles.
Ou vous pouvez utiliser CLion (disponible pour toutes les plates-formes) qui a également cette capacité (en fait, c'est la même fabrication JetBrains).
Il existe également un outil appelé inclure ce que vous avez utilisé , mais son objectif est de profiter des avantages de la déclaration avancée, je ne l'ai jamais utilisé (personnellement - mon coéquipier l'a fait pour notre projet).
la source