Automatische #Include Dateien
-
Hallo zusammen,
ich hoffe das Ihr mir helfen könnt. Ich übe mich gerade im Programmieren in C/C++.
Also Programmiersystem habe ich ein Borland RAD Studio 2007. Als zweites System habe ich noch die CodeLite-IDE mit dem MinGW Compiler installiert. Nun habe ich einige Projekte aus dem RAD Studio (also die Header- und Sourcecodedateien) einmal in die CodeLite-IDE übernommen und compilieren lasse. Dabei ist mir aufgefallen, das der Borland-Compiler sehr gutmütig ist. Er lässt viele funktionen (z.B. strncpy, strlen, oder auch cout) im Sourcecode zu, ohne das die dazu nötige Include-Datei (also <cstring>, <cstdlib> bzw. <iostream>) angegeben werden müssen. Der MinGW-Compiler verlangt die ausdrücklich.
Meine Frage nun wäre, weis jemand wie man dieses Verhalten dem Borland-Compiler ausschalten kann. Manb gewöhnt sich doch dadurch eine recht faule und bequeme Programmierweise an.Grüße Netzschleicher
-
Das hat nichts mit der Gutmütigkeit des Compilers zu tun, sondern damit, dass du bereits Header inkludierst, die ihrerseits die aufgezählten Header Dateien inkludieren. Ist auch bei MS Compilern nicht anders.
-
Das die eine oder andere Include-Datei wiederum andere includiert und man diese dadurch nicht extra angeben müsste ist mir schon klar. Komisch ist eben nur, das das getestete Programm in der Borland-IDE auch gänzlich ohne angegebene Include-Dateien übersetzt und ausgeführt werden kann.
-
Ich habe ebenfalls die 2007er Version und kann dir versichern, dass nichts inkludiert ohne ein direktes include.
Irgendwo musst du also was drin haben und sei es nur die vcl.h.
Ist dein Testbeispiel eine Konsolenanwendung ohne VCL?
-
Mein Testprogramm ist eine reine c++ Konsolenanwendung, ohne VCL.
Also#include <iostream>
muß schon drin stehen, aber wie geschrieben
die#include <cstring >
und
#include <cstdio>
kann ich weglassen und das Programm wird dennoch korrekt übersetzt.
-
Das ist einen Bananendiskussion. Hast du dir vielleicht mal überlegt, dass iostream Funktionen aus <cstdio> und <cstring> benötigt und sie daher inkludiert? Und das dann dem Compiler anzukreiden, er sei nachlässig und erlaube schlampiges Programmieren o.O
-
Ich habe das mal versucht etwas nachzuverfolgen.
iostream hat istream
istream hat ostream
ostream hat ios
ios hat xlocnum
xlocnum hat climits, cmath, cstdio, cstdlib, streambuf
jetzt habe ich aufgehört.
Das ist die include-Reihenfolge vom 2007er.
-
Jeder Compiler - egal ob C oder C++ und von welchem Hersteller - beinhaltet reine Sprachelemente und zahlreiche Funktionen aus bereitgestellten Bibliotheken. Für die letzteren müssen die zugehörigen Headerdateien für die Funktions-Prototypen bereitgestellt sein. Die Beschreibungen des Compilers teilen für jede gewünschte Funktion mit, was mit #include einzubinden ist. Ist in der Tat Banane, denn der Compiler meckert schon an, wenn er für etwas nichts vorfindet.
Frohe Weihnachten - Merry Christmas - Feliz Navidad - Boldog Kárascony - Glaedelig Jul -
:xmas1:
-
Das ist schon richtig. Nur manchmal möchte man nur das includen was man wirklich braucht und sei es nur um die Compilezeiten zu minimieren. Der Linker sollte ja eigentlich schlau genug sein nur das in das Projekt zu holen was benötigt wird.
-
Braunstein schrieb:
Das ist schon richtig. Nur manchmal möchte man nur das includen was man wirklich braucht und sei es nur um die Compilezeiten zu minimieren. Der Linker sollte ja eigentlich schlau genug sein nur das in das Projekt zu holen was benötigt wird.
Klar merkt der Linker wenn irgendetwas fehlt, meckert es an und lädt nur einmal. Für den Compiler auf includes zu verzichten, um Compilezeit zu sparen? Dafür gab es in 16-bit-Zeiten noch _ifndef oder wie das hiess. Was soll man da gross sparen - einige Millisekunden oder was?
-
Hast du noch kein größeres Projekt bearbeitet?
Was denkst du warum die vorkompilierten Header eingeführt wurden. Das können durchaus lange Zeiten werden.
Das was du mit den ifndefs meinst sind wohl eher die Include-Guards. Das hat hiermit nicht direkt was zu tun. Hier geht es eher darum mehrfache includes in die gleiche Übersetzungseinheit zu vermeiden (Mehrfachdeklarationen).
-
Dafür gibt es beim MS Compiler
#pragma once
. Allerdings ist das Problem auch nicht so neu, dass die Präprozessor-Entwickler nicht auf die Idee kommen könnten den Input zu cachen.
-
Braunstein schrieb:
Hast du noch kein größeres Projekt bearbeitet?
Habe ich und damit sogar Geld verdient selbst oder gerade als Bauingnieur. In den 1970er Jahren gab es noch keine PCs, man musste sich die Rechenzeit für teures Geld mieten oder für noch mehr Geld eine Workstation kaufen. Was juckt es mich, wenn ich das heute ohne zusätzliche Kosten und lange Wartezeiten selbst machen kann? Die Kosten in der Softwarentwicklung liegen heute allein im Zeitaufwand des oder der Softwareentwickler.
Das hat nun aber nichts mehr mit dem Thema zu tun!