math.h bzw cmath in vs 2010



  • Hallo Leute,
    Ich hab folgendes Problem. Ich wollte in Visual Studio ein Programm zum Ausrechen des tangens erstellen. Dazu habe ich fuer die ausgabe iostream eingebunden und fuer den tangens cmath. Das funktioniert auch. Lasse ich cmath in der headerdatei jedoch weg funktioniert das programm trotzdem . Warum?
    Das Programm ist uebrigens in reinem c++ geschrieben.
    Gruß jonse


  • Mod

    Es ist nicht verboten, dass iostream irgendwie indirekt cmath einbindet. Aber du kannst und solltest dich nicht darauf verlassen.



  • Du kannst mal rechtsklick auf #include <iostream> machen und auf Dokument öffnen klicken und immer weiter den includes folgen, dann kommt sowas raus:

    "->" bedeutet "inkludiert"
    iostream -> istream -> ostream -> ios -> xlocnum -> cmath

    Ich meine mal gehört zu haben, dass Funktionen wie sin und printf als eingebaut gelten und selbst dann zur Verfügung stehen, wenn sie gar nicht eingebunden oder gar selbst definiert wurden. Sinn ist zum Beispiel bei float f = sin(5.f) das sin weg optimieren zu können. Das kann ich aber gerade mit VS 2010 nicht nachvollziehen.



  • nwp3 schrieb:

    Ich meine mal gehört zu haben, dass Funktionen wie sin und printf als eingebaut gelten und selbst dann zur Verfügung stehen, wenn sie gar nicht eingebunden oder gar selbst definiert wurden.

    Definiert werden müssen sie immer. Aber die Definitionen interessieren ja auch erst den Linker. In C (nicht C++) kannst du diese Funktionen nutzen obwohl sie nicht deklariert wurden, bzw. sie werden in dem Moment deklariert, in dem du sie benutzt. Wenn dann eine passende Definition vom Linker gefunden wird, gibt's auch keinen Fehler. Aber wie gesagt, das ist C, nicht C++.

    nwp3 schrieb:

    Sinn ist zum Beispiel bei float f = sin(5.f) das sin weg optimieren zu können.

    Der Optimizer interessiert sich nicht die Bohne dafür, ob irgendwas deklariert/definiert wurde oder nicht. Ganz andere Ebene.



  • Ach cooky...
    Schonmal was von intrinsics gehört?
    Klar kann der Optimizer nen sin Aufruf wegoptimieren, das macht nicht erst der Linker.
    printf dagegen vermutlich weniger. Obwohl es bei sehr einfachen sprintf Aufrufen auch denkbar wäre (und im Fall s printf u.U. sogar sinnvoll).



  • Erstmal vielen Dank für die schnellen Rückmeldungen.

    Werde cmath dann einbinden un mich nicht nut auf iostream verlassen wenn cmath eigentlich benötigt wäre . Aber es ist normal dass diese Tangens,sinus... Auch so funktionieren?

    Gruß Jonse



  • hustbaer schrieb:

    Ach cooky...
    Schonmal was von intrinsics gehört?

    Eh.. ja.

    hustbaer schrieb:

    Klar kann der Optimizer nen sin Aufruf wegoptimieren, das macht nicht erst der Linker.

    Wo hab ich das geschrieben? 😕


  • Mod

    Jonse96 schrieb:

    Werde cmath dann einbinden un mich nicht nut auf iostream verlassen wenn cmath eigentlich benötigt wäre . Aber es ist normal dass diese Tangens,sinus... Auch so funktionieren?

    Nein, Visual Studio scheint ziemlich liberal mit indirekten includes umzugehen. Andere Standardbibliotheksschreiber fahren andere Philosophien. Beim beliebten und verbreiteten GCC gibt man sich beispielsweise sehr viel Mühe, fast nichts was nicht muss* indirekt zu benutzen.

    *: Gerne übersehener Fakt: Ein paar indirekte Includes sind durch den Standard vorgeschrieben. iostream ist beispielsweise neben den Objekten cin, cout und cerr auch noch eine Art Superheader für alles was mit Ein-/Ausgabe zu tun hat.


Anmelden zum Antworten