Angenommen, ich habe den folgenden (sehr einfachen) Code.
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Dies lässt sich sowohl in g ++ als auch in clang gut kompilieren. Es kann jedoch nicht mit folgendem Fehler auf MSVC kompiliert werden:
Fehler C2039: 'stoi': ist kein Mitglied von 'std'
Fehler C3861: 'stoi': Kennung nicht gefunden
Ich weiß, dass dies std::stoiTeil des <string>Headers ist, den vermutlich die beiden ersteren Compiler als Teil enthalten <iostream>und der letztere nicht. Nach dem C ++ Standard [res.on.headers]
Ein C ++ - Header kann andere C ++ - Header enthalten.
Was für mich im Grunde bedeutet, dass alle drei Compiler korrekt sind.
Dieses Problem trat auf, als einer meiner Schüler Arbeiten einreichte, die der TA als nicht kompilierend markierte. Ich habe es natürlich repariert. Ich möchte jedoch zukünftige Vorfälle wie diese verhindern. Gibt es also eine Möglichkeit zu bestimmen, welche Header-Dateien enthalten sein sollen, ohne auf drei verschiedenen Compilern zu kompilieren, die jedes Mal überprüft werden müssen?
Ich kann mir nur vorstellen, dass für jeden stdFunktionsaufruf ein geeignetes Include vorhanden ist. Wenn Sie jedoch Code haben, der Tausende von Zeilen lang ist, kann das Durchsuchen mühsam sein. Gibt es eine einfachere / bessere Möglichkeit, die Cross-Compiler-Kompatibilität sicherzustellen?
Beispiel mit den drei Compilern: https://godbolt.org/z/kJhS6U
std::stoiSie sofort sicher, dass auch dieser #include <string>vorhanden ist.
std::stoifür die Behandlung von Zeichenfolgen vorgesehen ist, können Sie davon ausgehen, dass<string>dies ein guter Header wäre. Oder Sie könnten nach einer guten Referenz suchen, die Ihnen sagt. Und ich empfehle, dass Sie die Header-Dateien immer explizit einschließen, damit Sie sich nicht auf ein nicht portables implementierungsspezifisches Verhalten verlassen müssen.