Ohne Headerdateien lauffähige Programme



  • Hi Leute,
    ich habe C# als erste Sprache gelernt und bin dort bis in die OOP gekommen. Nun möchte mich in C einarbeiten und bin hier bis zu Pointern und dynamischer Speicherreservierung vorgedrungen.
    Wie das mit den include Befehlen und den entsprechenden Headerdateien (stdio.h, math.h usw.) abläuft und was dahinter steckt, meine ich also auch verstanden zu haben (Kenne das erstens aus C# und zweitens lese ich das Buch "C easy von Jürgen Wolf" wie auch das Openbook nebenbei).

    Warum aber läuft folgendes Programm bei mir, ohne die Headerdatei

    #include <stdio.h>
    

    :

    int main(int argc, char *argv[])
    {
        printf("Hello World");
        return 0;
    }
    

    Ich kann das Programm sowohl kompilieren als auch starten.
    Zugegeben, wenn ich die Headerdatei weglasse, kommt eine Warnung

    warning: implicit declaration of function `printf'

    Aber eigentlich nicht das, was ich vermutet hatte und das laut der Literatur rauskommen sollte.

    Ich verwende Code_Blocks mit dem GNU GCC compiler.

    Mag sich wer erbarmen und mir eine Erklärung liefern, damit ich nicht alleine dumm darstehe?

    Vielen Dank und freundlichen Gruß



  • Headerdateien sind anders, als die using-Sachen aus C#! #include "foo" wird vom Preprozessor einfach durch den Inhalt der Datei foo ersetzt. Headerdateien enthalten nicht die Implementierungen der Funktionen (ausnahme inline-Funktionen. aber das kannst du erstmal ignorieren), sondern nur die Deklaration. Die Implementierung befindet sich in einer anderen c-Datei bzw. in einer bereits kompilierten Bibliothek.

    In C gibt es eine Regel, dass Funktionen implizit deklariert werden können. Wenn eine Funktion nicht bekannt ist, dann wird iirc einfach int funktion() angenommen. Er GCC warnt in diesem Fall, da man dies idR nicht will, da es Fehlern führen kann, wenn der Funktionsprototyp anders ist. (Aus dem Grund sollte man zB den Rückgabewert von malloc nicht casten, da der cast die Warnung unterdrückt: http://www.c-plusplus.net/forum/viewtopic.php?t=206606)

    In C99 wurde das implizite deklarieren zum Glück entfernt. Wenn du -std=c99 -pedantic-errors zu den Compilerflags hinzufügst, solltest du eine Fehlermeldung erhalten.



  • Hi und danke für deine Antwort!

    rüdiger schrieb:

    Headerdateien enthalten nicht die Implementierungen der Funktionen..., sondern nur die Deklaration. Die Implementierung befindet sich in einer anderen c-Datei bzw. in einer bereits kompilierten Bibliothek.

    ...

    In C99 wurde das implizite deklarieren zum Glück entfernt. Wenn du** -std=c99 -pedantic-errors **zu den Compilerflags hinzufügst, solltest du eine Fehlermeldung erhalten.

    Ich bin jetzt in den Compilersettings:

    Das ist das Einzige, was ich finden konnte. Dein -std = c99 kann ich nicht finden.

    Ich erhalte trotzdem keine Fehlermeldung, obwohl ich eine erhalten möchte 😞

    Bringt deinstallieren und neu installieren etwas? Ich hatte vorher den Dev C++ installiert und parallel dazu Code:Blocks, weil ich es als Alternative ausprobieren wollte. Dabei hat Code:Blocks zunächst den Compiler aus dem Verzeichnis von Dev C++ verwendet (habs aber geändert und verwende nun den von Code:Blocks installierten Compiler).

    Ach herrje, ich bin ratlos 😕



  • Sowohl DevC++ als auch Code::Blocks haben von sich aus einen uralten Compiler dabei. Eventuell mal einen aktuellen Compiler probieren?



  • Hi,

    Janjan schrieb:

    Sowohl DevC++ als auch Code::Blocks haben von sich aus einen uralten Compiler dabei. Eventuell mal einen aktuellen Compiler probieren?

    okay, das wäre ein Versuch wert. Ich habe mir jetzt Borland C++ Compiler 5.5 runtergeladen und installiert. Code:Blocks scheint aber Schwierigkeiten zu haben, den Compiler zu finden. Wenn ich den Pfad manuell eingebe, kommt folgende Meldung:

    Execution of 'bcc32.exe -q -w  -v    -I"C:\Program Files\Borland\BDS\4.0\include"  -oobj\Debug\main.obj -c main.c' in 'D:\Program Files\CodeBlocks\Projects\nu' failed.
    

    Gibt es eventuell einen anderen Compiler? Oder eine andere IDE? Ich muss gestehen, dass ich sehr von der VS C# IDE verwöhnt bin.

    Womit programmiert ihr denn?

    Danke und Gruß



  • ah nein, den BCC kannst du sofort wieder deinstallieren.

    DevC++ und Code::Blocks sind keine Compiler! Sondern nur die Entwicklungsumgebungen. (DevC++ ist außerdem veraltet und fehlerhaft). Der Compiler der von beiden benutzt wird ist der MinGW-Compiler. Dabei handelt es sich um einer Portierung des GCCs für Windows. Inoffizielle MinGW Binaries die aber aktuelleren GCCs entsprechen findest du hier: http://www.tdragon.net/recentgcc/

    Ich nutze kein Code::Blocks. Aber wenn es dort kein Flag für C99-Modus gibt (was ziemlich blöd wäre), dann kannst du sicher irgend wo eigene Flags aufschreiben. Bei Google hab ich auf die schnelle folgendes gefunden: http://forums.codeblocks.org/index.php?action=printpage;topic=7137.0



  • Hallo,

    rüdiger schrieb:

    ah nein, den BCC kannst du sofort wieder deinstallieren.

    Magst du bitte begründen, weshalb ich den wieder deinstallieren soll? Ich dachte, der Borland Compiler sei empfehlenswert.

    rüdiger schrieb:

    Der Compiler der von beiden benutzt wird ist der MinGW-Compiler. Dabei handelt es sich um einer Portierung des GCCs für Windows. Inoffizielle MinGW Binaries die aber aktuelleren GCCs entsprechen findest du hier: http://www.tdragon.net/recentgcc

    Okay, hab mir nun TDM/MinGW runtergeladen und installiert. Ich verwende für meine C Projekte den GNU GCC compiler. Der wird leider nicht gefunden (bei autopath) und wenn ich den Pfad manuell eingebe (zum neuen Installationsziel den TDM/MinGW), schaffe ich keine kompilierung. Fehlermeldung:

    Execution of 'mingw32-gcc.exe -Wall -g -pedantic-errors -c "D:\Program Files\CodeBlocks\Projects\hallo\main.c" -o obj\Debug\main.o' in 'D:\Program Files\CodeBlocks\Projects\hallo' failed.

    Was mache ich verkehrt?

    [/quote]
    Ich nutze kein Code::Blocks. Aber wenn es dort kein Flag für C99-Modus gibt (was ziemlich blöd wäre), dann kannst du sicher irgend wo eigene Flags aufschreiben. Bei Google hab ich auf die schnelle folgendes gefunden: http://forums.codeblocks.org/index.php?action=printpage;topic=7137.0[/quote][/quote]

    Okay, dank dir. Wenn ich das mit dem TDM/MinGW nicht auf die Reihe bekomme, muss ich das Flag manuell hinzufügen und mit nem "alten" Compiler arbeiten. Aber momentan finde ich C total schwer und kann nicht verstehen, wie man da durchblicken kann/soll 😞

    Was mache ich denn konkret verkehrt?

    Danke und Gruß



  • Hast du den TDM GCC in einem Verzeichnis mit Leerzeichen installiert? Das wird nämlich afaik nicht unterstützt. Du kannst bei Project->Build Options->Debug/Release->(im Tab-Menü)Other options->-std=c99 eingeben (das sollte ungefähr so stimmen).



  • ...und ich weiß nur nicht, was ich gemacht habe 😃

    Okay Leute, ich möchte euch nicht weiter belästigen. Ich habe das -std=c99 einpflegen können und nun bekomme ich auch eine Fehlermeldung.

    Was -std=c99 ist und warum ich erst diesen Umweg mit ner neuen, inoffiziellen GCC machen musste, ist mir schleierhaft.

    Vielen Dank an alle, die mir geholfen haben.

    Gruß



  • al3ko schrieb:

    Kenne das erstens aus C# und zweitens lese ich das Buch "C easy von Jürgen Wolf" wie auch das Openbook nebenbei
    ...
    Aber momentan finde ich C total schwer und kann nicht verstehen, wie man da durchblicken kann/soll 😞

    Woran das wohl liegen könnte?
    http://w3.c-plusplus.info/forum/viewtopic-var-t-is-254601-and-postdays-is-0-and-postorder-is-asc-and-start-is-3.html

    Hände weg von allem wo "Jürgen" und "Wolf" draufsteht.

    Alle üblichen C-Compiler setzen voraus, dass der User weiss, was ein Compiler und was ein Linker macht. Compiler arbeiten mit Quelltexten(*.c, *.h), Linker mit Objektdateien. Wenn du einen Header weglässt, kann es geschehen, dass der Compiler einige Funktionen implizit deklariert, unter Umständen sogar passend. Wenn das Programm dann auch ohne Header läuft, liegt das daran, dass der Linker die betreffende Bibliothek trotzdem verlinkt hat.

    al3ko schrieb:

    Was -std=c99 ist und warum ich erst diesen Umweg mit ner neuen, inoffiziellen GCC machen musste, ist mir schleierhaft.

    In C99 wurde das implizite Deklarieren zum Glück entfernt. Wenn du -std=c99 -pedantic-errors zu den Compilerflags hinzufügst, solltest du eine Fehlermeldung erhalten.
    C99 ist der jüngste C-Standard, ISO/IEC 9899. Das ist kein Umweg, und du musst ihn nicht machen. Du tust es in dem Fall nur, damit du die Fehlermeldungen besser verstehst.
    🙂



  • al3ko schrieb:

    Aber eigentlich nicht das, was ich vermutet hatte und das laut der Literatur rauskommen sollte.

    Was sollte denn laut der Literatur rauskommen?
    🙂



  • Oh, okay. Dann muss ich mich nach einer anderen Literatur umsehen. Hier im Forum gibts bestimmt 100 Threads zu Buchempfehlungen. Ich stöber mal ein wenig 🙂

    Laut Jürgen Wolf:

    hallo.cpp(5):'printf':nichtdeklarierter Bezeichner
    oder
    Error. function 'printf' should have a prototype

    Beispiel aus dem simplen Hello World Programm.

    Gruß


Anmelden zum Antworten