Dies ist eine Folgefrage für this das sagt das
In C ++ dürfen Standard-Header anders als C # andere Standard-Header enthalten.
Gibt es eine Möglichkeit zu wissen, welche Header automatisch eingefügt wurden, da es schwierig zu erraten ist, welche Symbole in welchen Headern definiert sind.
Motivation: Meine Hausaufgaben kompilieren und funktionieren korrekt auf meinem Computer, aber TA sagte mir, dass es nicht Kompilieren und benötigt einige Header (Mutex und Algorithmus) zu kompilieren. Wie ich sicher sein kann, dass der Code, den ich in Zukunft einreiche, kugelsicher ist.
Mein Compiler warnt nicht vor impliziter Deklaration.
Ich verwende clang++ -std=c++11
, um meinen Code zu kompilieren.
Der Standard listet die Symbole auf, die von jedem Header zur Verfügung gestellt werden. Darüber hinaus gibt es keine Garantien, weder dass offensichtlich verwendete Symbole noch dass nicht alle Symbole deklariert sind. Sie müssen jede Kopfzeile für jeden Namen angeben, den Sie verwenden. Sie sollten sich nicht auf indirekte Includes verlassen.
Auf der positiven Seite gibt es keinen Fall in der Standard-Bibliothek, wo einer der Header der Standardbibliothek zusätzliche Header benötigt.
Wenn Sie wissen möchten, welche anderen Header eine bestimmte Header-Datei enthält, können Sie dies am einfachsten tun, indem Sie die Include-Datei nur über die Preprozessor-Phase des Compilers ausführen, anstatt sie vollständig zu kompilieren. Wenn Sie beispielsweise wissen möchten, wie <iostream>
abgerufen wird, erstellen Sie eine Datei, die nur Folgendes enthält:
dann vorverarbeiten. Mit gcc
führt die Option -E
nur den Präprozessor aus, ohne die Datei zu kompilieren, und gibt die vorverarbeitete Datei an die Standardausgabe aus. Die resultierende Ausgabe beginnt mit:
Das ist meine einzeilige Quelldatei.
%Vor% Offenbar zieht gcc
automatisch diese Header-Datei ein, egal was passiert. Dies kann ignoriert werden.
Ok, jetzt kommen wir endlich zur eigentlichen #include
Anweisung in meiner einzeiligen Quelldatei. Das ist, wo mein <iostream>
ist:
Ok, also iostream
selbst #include
s diese Header-Datei "c ++ - config.h", offensichtlich ein interner Compiler-Header.
Wenn ich weitermache, kann ich sehen, dass <iostream>
, nicht überraschend, <ios>
, <type_traits>
, sowie C-Header-Dateien wie stdio.h
einzieht.
Es sollte nicht zu schwer sein, ein kleines Skript zu schreiben, das eine Header-Datei übernimmt, den Compiler in der Vorverarbeitungsphase ausführt und eine nette, formatierte Liste aller eingezogenen Header-Dateien erstellt.
Soweit ich weiß, gibt es keine Möglichkeit zu tun, was Sie wollen.
Wenn Sie versuchen, Ihren Code auf mehreren Beispielplattformen zu kompilieren, und es erfolgreich ist, besteht eine größere Chance, dass er auf einer anderen Plattform kompiliert wird, aber es gibt keinen einfachen Weg, um sicher zu sein.
Meiner Erfahrung nach verwenden MinGW C ++ - Header weniger #include
s. Daher kann MinGW ein praktisches Werkzeug zur Überprüfung der Portabilität sein.