Welche C++ Libraries sind standardmäßig immer dabei ohne diese zu
includen. Hintergrung der Frage ist, ich kann ohne irgendwelche Header
Dateien zu importieren einfache Sachen programmieren wie z.B.:
int a, b, c;
c = a + b;
Aber woher weiß ich was standardmäßig schon in Visual Studio von
Microsoft drin ist(ich meine ohne #include<..>)?
Sind bei jeder IDE standardmäßig schon Libraries drin bzw. gibt es
bestimmte Standard Libraries die immer schon dabei sind ohne diese extra
durch #include<..> zu importieren?
Guest123 schrieb:> Welche C++ Libraries sind standardmäßig immer dabei ohne diese zu> includen.
Keine.
Guest123 schrieb:> int a, b, c;> c = a + b;
Das geht immer, da hier nichts aus irgendwelchen Bibliotheken genutzt
wird. Integer-Typen und Arithmetik darauf ist Bestandteil der Sprache
selbst, und kommt aus keiner Bibliothek.
Guest123 schrieb:> Aber woher weiß ich was standardmäßig schon in Visual Studio von> Microsoft drin ist(ich meine ohne #include<..>)?
Alles was keine Funktionen, Klassen oder Typen außer den
Standard-Integer-Typen benutzt. Es gibt einige vordefinierte Makros die
ebenfalls immer dabei sind:
https://msdn.microsoft.com/en-us/library/b0084kay.aspxGuest123 schrieb:> Sind bei jeder IDE standardmäßig schon Libraries drin
Nein.
Guest123 schrieb:> bzw. gibt es> bestimmte Standard Libraries die immer schon dabei sind ohne diese extra> durch #include<..> zu importieren?
Nein.
Die Compiler bieten allerdings einige Erweiterungen zur Sprache; diese
sind dann Teil der Sprache und nicht der Bibliothek, und auch ohne
#include nutzbar, z.B. "declspec" in Visual C++. Solche Dinge sollte man
aber sowieso soweit wie möglich vermeiden und nur Dinge nutzen, die der
C++ Standard garantiert.
Die Header der Standard-Bibliothek, also z.B. <iostream>, <algorithm>,
<type_traits> ... sollten aber bei jedem C++-Compiler dabei sein. Es
macht wenig Sinn, diese irgendwie zu vermeiden. Das Programm wird nicht
größer, langsamer oder hässlicher wenn man diese Header einbindet.
Guest123 schrieb:> Welche C++ Libraries sind standardmäßig immer dabei ohne diese zu> includen.
Man "includet" keine Libraries, sondern Header-Dateien.
> Hintergrung der Frage ist, ich kann ohne irgendwelche Header> Dateien zu importieren einfache Sachen programmieren wie z.B.:> int a, b, c;> c = a + b;
Das gehört zum Sprachkern, nicht zu irgendwelchen Libraries.
> Aber woher weiß ich was standardmäßig schon in Visual Studio von> Microsoft drin ist(ich meine ohne #include<..>)?
Indem du die Sprache lernst ;-)
> Sind bei jeder IDE standardmäßig schon Libraries drin bzw. gibt es> bestimmte Standard Libraries die immer schon dabei sind ohne> diese extra> durch #include<..> zu importieren?
Wenn, dann nicht bei der IDE, sondern beim Compiler/Linker. Aber in der
Regel nicht.
Rolf M. schrieb:> Man "includet" keine Libraries, sondern Header-Dateien.
Das haben wir den Arduino-Leuten zu verdanken, die den Begriff
missbrauchen.
So sehr mir das gegen den Strich geht, wir werden uns wohl damit
abfinden müssen, in Zukunft zwischen zwei Arten von Libraries zu
differenzieren - Binärlibraries ("echte Libraries", *.a oder *.lib)
und Sourcelibraries (aber nur bei C++, wie das ganze Arduino-Geraffel,
aber auch solche Dinge wie die STL).
Oder man definiert den Begriff "Library" einfach abstrakter als
"wiederverwendbare Programmkomponente" o.ä. ohne konkrete Angabe, wie
dies technisch umgesetzt wird. Dies ist dann ein Überbegriff für die
einzelnen Varianten, für die man dann spezifische Begriffe verwendet:
- "Header-Only Library" für (template-)Bibliotheken, bei denen alles
inline ist und die eben nur in Form von Header-Dateien ausgeliefert
werden, wie std::vector oder z.B. https://github.com/Erlkoenig90/uSer
- "Static Library" - .a / .lib mit kompiliertem aber nicht gelinktem
Code
- "Shared Object/Dynamic Library" - .so / .dll mit kompiliertem und
gelinkten Code.
Wenn man tatsächlich weiß, wovon man redet, ist das ja alles vollkommen
in Ordnung.
Wenn man aber nur die "Arduino"-Sichtweise kennt, und dann mit dem
anderen, älteren Modell der Binärlibrary konfrontiert wird (die dritte
Variante ist auf µCs eher nicht zu finden), dann gibt es fast jedesmal
größere Verständnisprobleme.
Klar ist jedenfalls, daß man in C nur Binärlibraries verwenden kann, in
C++ hingegen sowohl Binär- als auch Sourcelibraries.
Rufus Τ. F. schrieb:> Klar ist jedenfalls, daß man in C nur Binärlibraries verwenden kann
Wie das? Ich kann in C doch auch einen Header schreiben, der nur
Typ-Definitionen, Makros und inline-Funktionen enthält...
Niklas G. schrieb:> Ich kann in C doch auch einen Header schreiben, der nur> Typ-Definitionen, Makros und inline-Funktionen enthält...
Natürlich kannst Du das. Das aber ist keine Library.
Rufus Τ. F. schrieb:> Niklas G. schrieb:>> Ich kann in C doch auch einen Header schreiben, der nur>> Typ-Definitionen, Makros und inline-Funktionen enthält...>> Natürlich kannst Du das. Das aber ist keine Library.
Was macht den C++-Header denn zur Source-Library, das in C nicht möglich
ist?
Dirk K. schrieb:> Rolf M. schrieb:>> Was macht den C++-Header denn zur Source-Library, das in C nicht möglich>> ist?>> Templates.
Und wenn da Funktionen stehen, die keine Templates sind, ist es keine
Lib mehr?
Rolf M. schrieb:> Und wenn da Funktionen stehen, die keine Templates sind, ist es keine> Lib mehr?
Man kann natürlich den einfachen Weg gehen und einfach alles "Lib"
nennen, was einem unter die Finger kommt, das vereinfacht vor allem
technische Diskussionen ungemein.
Rufus Τ. F. schrieb:> Rolf M. schrieb:>> Und wenn da Funktionen stehen, die keine Templates sind, ist es keine>> Lib mehr?>> Man kann natürlich den einfachen Weg gehen und einfach alles "Lib"> nennen, was einem unter die Finger kommt, das vereinfacht vor allem> technische Diskussionen ungemein.
Ein anderer einfacher Weg ist, sich irgendwelche willkürlichen
Voraussetzungen wie "enthält Templates" zur Definition einer "Lib"
herzunehmen.
Nun, der im C- und auch C++-Bereich bislang klar und eindeutig
definierte Begriff "Library" wurde durch Gebilde wie die STL im
C++-Bereich verwässert und durch die massiv falsche Anwendung des
Begriffes im Arduino-Bereich noch weiter verdünnt, um nicht zu sagen
potenziert.
Rufus Τ. F. schrieb:> massiv falsche Anwendung des> Begriffes im Arduino-Bereich noch weiter verdünnt, um nicht zu sagen> potenziert.
Kannst du das näher erläutern?
"Eine Bibliothek bezeichnet in der Programmierung eine Sammlung von
Unterprogrammen/-Routinen, die Lösungswege für thematisch
zusammengehörende Problemstellungen anbieten. Bibliotheken sind im
Unterschied zu Programmen keine eigenständig lauffähigen Einheiten,
sondern sie enthalten Hilfsmodule, die von Programmen angefordert
werden."
=> Passt doch wunderbar?
Ja, wenn man die allgemeinstmöglich gehaltene Formulierung verwendet,
dann passt das. Dann aber ist jedes beliebige Stück Sourcecode, das sich
nicht im gleichen Sourcefile wie main oder setup und loop
befindet, eine "Bibliothek", und damit ist irgendwie wenig gewonnen.
Rolf M. schrieb:> Dirk K. schrieb:>> Rolf M. schrieb:>>> Was macht den C++-Header denn zur Source-Library, das in C nicht möglich>>> ist?>>>> Templates.>> Und wenn da Funktionen stehen, die keine Templates sind, ist es keine> Lib mehr?
Hab ich nicht behauptet.
C++-Templates stehen technisch bedingt in Header-Files
und sind für einen C-Compiler unbekannt.
Ich vertrete ja auch die Meinung, dass man alles
mögliche als Bibliothek bezeichnen kann, was irgendwie
Code zur Wiederverwendung enthält. Außerdem verstehe
ich diese Diskussion hier nicht mehr, das ist mir etwas
zu akademisch geworden (um nicht zu sagen: esoterisch).
Der Wikipedia-Artikel beschreibt recht gut meine
Vorstellung einer Bibliothek.
merciless
Dirk K. schrieb:> Außerdem verstehe> ich diese Diskussion hier nicht mehr, das ist mir etwas> zu akademisch geworden (um nicht zu sagen: esoterisch).
Aha. *.a-, *.lib- oder auch *.so bzw. *.dll sind "akademisch" und
"esoterisch", oder die Unterscheidung zwischen diesen Dingen und
Quelltext.
Warum nennen wir eigentlich unterschiedliche Programmiersprachen
unterschiedlich? Es reicht doch, wenn wir sie einfach
"Programmiersprache" nennen, der Rest erschließt sich dann ja aus dem
Kontext.
Rufus Τ. F. schrieb:> Aha. *.a-, *.lib- oder auch *.so bzw. *.dll sind "akademisch" und> "esoterisch",
Hö?
Es gibt keine klare Definition, ob ein
Bithaufen eine Bibliothek darstellt oder
nicht. Der Wikipedia-Artikel beschreibt
das meiner Meinung nach ganz vernünftig.
Esoterisch ist für mich der Versuch, diese
Definition zu treffen.
Bibliothek also nur, wenn Binaries dabeiliegen?
Was ist dann die STL? Die hat ja dann schon
den falschen Namen (Standard Template Library).
BOOST: Gemisch aus Templates/Binaries, aber
auch Bibliothek? Sammlung von Macros in
C-Headerfiles, Bibliothek?
merciless
Dirk K. schrieb:> Was ist dann die STL? Die hat ja dann schon> den falschen Namen (Standard Template Library).
Meinst du wirklich die originale STL, welche bei SGI entwickelt wurde
und praktisch nicht mehr verwendet wird? Sicher dass die Header-Only
ist/war?
Siehe https://stackoverflow.com/a/5205571
Die standardisierte, von (fast) allen Compilern unterstützte C++
Standard Library, ist zum Beispiel beim GCC ein Shared Object, also eine
"echte" Bibliothek, sie enthält eine "libstdc++.so", und natürlich
Header mit vielen templates. Nebenbei sind auch Funktionen & Klassen
enthalten, die überhaupt keine templates sind, und ganz gewöhnliche
Nicht-inline-Definitionen haben, eben in dieser .so Datei.
Rufus Τ. F. schrieb:> Warum nennen wir eigentlich unterschiedliche Programmiersprachen> unterschiedlich? Es reicht doch, wenn wir sie einfach> "Programmiersprache" nennen
Ähhh, genau das tun wir doch. "Programmiersprache" ist ein Sammelbegriff
für alle möglichen Sprachen (C++, Java, usw.).
Manche Leute...
Gugelhupf schrieb:> Ähhh, genau das tun wir doch
Nein. Hier im Forum erwähnen wir, in welcher Programmiersprache wir
irgendwas geschrieben haben, und manche hauen sich deswegen auch die
Köpfe ein.
Einfach nur "Hier ist Code für µC XY, geschrieben in einer
Programmiersprache" gibt es hier nicht, sondern es wird explizit darauf
hingewiesen, ob das C, C++, Assembler, Pascal oder was auch immer ist.
Gugelhupf schrieb:> "Eine Bibliothek bezeichnet in der Programmierung eine Sammlung von> Unterprogrammen/-Routinen, die Lösungswege für thematisch> zusammengehörende Problemstellungen anbieten."
Und um was handelt es sich, wenn sich in dieser Sammlung auch
Lösungswege für thematisch nicht zusammengehörende Problemstellungen
befinden?
> Bibliotheken sind im> Unterschied zu Programmen keine eigenständig lauffähigen Einheiten,> sondern sie enthalten Hilfsmodule, die von Programmen angefordert> werden."
Programmcode, der von einem Betriebssystem nachgeladen und dann
ausgeführt wird, wäre somit auch kein Programm, da er meist auf
Betriebsmittel des Betriebssystems zurückgreift und auch erhebliche
Initialisierungsaufgaben vom Betriebssystem übernommen werden. Auch der
Einstieg mittels Sprung in eine main()-Funktion o.ä. entspricht eher dem
Aufruf einer Bibliotheksfunktion.
Folglich wäre höchstens Programmcode, der direkt ohne Bootloader ab dem
Reset ausgeführt wird, als Programm anzusehen? Und wie sieht es aus,
wenn solch ein Programmcode selbst auf Bibliotheken zurückgreift, die
separat im Speicher liegen?
Wenn wir auch unter einem Betriebssystem nachgeladenen und gestarteten
Programmcode als Programme bezeichnen, gibt es wiederum die
entgegengesetzten Fälle, nämlich dass als DLL vorliegender Code
weitestgehend eigenständig ablaufen kann und sämtliche Funktionalität
mitbringt. Vielfach wird so etwas z.B. als "Server" bezeichnet.
> => Passt doch wunderbar?
Naja.
Niklas G. schrieb:> Dirk K. schrieb:>> Was ist dann die STL? Die hat ja dann schon>> den falschen Namen (Standard Template Library).>> Meinst du wirklich die originale STL, welche bei SGI entwickelt wurde> und praktisch nicht mehr verwendet wird? Sicher dass die Header-Only> ist/war?> Siehe https://stackoverflow.com/a/5205571
Nein, ich meine das, was landläufig darunter
verstanden wird: Eine Sammlung von C++-Headerfiles,
die Templates enthalten.
> Die standardisierte, von (fast) allen Compilern unterstützte C++> Standard Library, ist zum Beispiel beim GCC ein Shared Object, also eine> "echte" Bibliothek, sie enthält eine "libstdc++.so", und natürlich> Header mit vielen templates. Nebenbei sind auch Funktionen & Klassen> enthalten, die überhaupt keine templates sind, und ganz gewöhnliche> Nicht-inline-Definitionen haben, eben in dieser .so Datei.
STL != C++ Standard Library
https://de.wikipedia.org/wiki/Standard_Template_Library
merciless
Dirk K. schrieb:> Eine Sammlung von C++-Headerfiles,> die Templates enthalten.
Also <vector>, <string> etc., aber nicht <cstdio> oder <clocale>? Per
Standard gehört das alles zur Standard Library. Bei üblichen
Implementationen gehören die auch untrennbar zusammen. Außerdem heißt es
im von dir zitierten Artikel sogar:
"Aus diesem Grund ist es nicht möglich, eine Teilmenge der
C++-Standardbibliothek als STL zu benennen."
Landläufige Begriffe sind leider etwas schwammig...
Dirk K. schrieb:> STL != C++ Standard Library
Das habe ich auch gesagt