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::stoi
Teil 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 std
Funktionsaufruf 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::stoi
fü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.std::stoi
Sie sofort sicher, dass auch dieser#include <string>
vorhanden ist.Antworten:
Dies wird immer ein bisschen mühsam sein, wenn Sie eine riesige Codebasis haben und dies bisher noch nicht getan haben, aber sobald Sie Ihre Includes repariert haben, können Sie sich an ein einfaches Verfahren halten:
Wenn Sie neuen Code schreiben, der eine Standardfunktion verwendet, z. B.
std::stoi
diesen Namen in Google einbinden, den Artikel cppreference.com lesen und oben nachsehen, in welchem Header er definiert ist.Fügen Sie das dann hinzu, falls es nicht bereits enthalten ist. Job erledigt!
(Sie könnten den Standard dafür verwenden, aber das ist nicht so zugänglich.)
Seien Sie nicht versucht, alles zugunsten billiger, nicht portierbarer Hacks wie
<bits/stdc++.h>
!tl; dr: Dokumentation
quelle
Neben der Überprüfung der Dokumentation und der manuellen Ausführung (schmerzhaft und zeitaufwändig) können Sie einige Tools verwenden, die dies für Sie tun können.
Sie können ReSharper in Visual Studio verwenden, das Importe organisieren kann (tatsächlich ist VS ohne ReSharper nicht sehr brauchbar). Wenn include fehlt, wird empfohlen, es hinzuzufügen, und wenn es veraltet ist, wird die Zeile mit include in helleren Farben angezeigt.
Oder Sie können CLion (für alle Plattformen verfügbar) verwenden, das ebenfalls über diese Funktion verfügt (tatsächlich handelt es sich um JetBrains der gleichen Hersteller).
Es gibt auch ein Tool namens include, was Sie verwendet haben , aber das Ziel ist es, die Vorteile der Vorwärtsdeklaration zu nutzen. Ich habe das nie verwendet (persönlich - mein Teamkollege hat das für unser Projekt getan).
quelle