====== Programmierung in C/C++ ====== Einige allgemeine Infos zu den Sprachen C/C++ und deren Authoren: * [[https://de.wikipedia.org/wiki/C_(Programmiersprache)|Programmiersprache C]]: [[https://de.wikipedia.org/wiki/Brian_W._Kernighan|Brian W. Kernighan]] und [[https://de.wikipedia.org/wiki/Dennis_Ritchie|Dennis Ritchie]] (Entwickler des [[https://de.wikipedia.org/wiki/Unix|UNIX]]-Betriebssystems) * [[https://de.wikipedia.org/wiki/C%2B%2B|Programmiersprache C++]]: [[https://de.wikipedia.org/wiki/Bjarne_Stroustrup|Bjarne Stroustrup]] ---- . Infos zum Kompilieren/Linken sind unter [[EDV:PRG:GCC]], [[EDV:PRG:Make]] (für die GNU Compiler Collection) und [[EDV:PRG:IDE:MsVisualStudio|MS Visual Studio]] (für den Microsoft Compiler) zu finden. * GCC-Pragmas: [[https://gcc.gnu.org/onlinedocs/gcc/Pragmas.html#Pragmas]] Compatibility of C and C++: [[https://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B]] Siehe auch **[[https://wiki.ubuntuusers.de/GCC/#Empfohlene-Parameter|Empfohlene Parameter]]** (von "ubuntuusers.de"). ===== Tools ===== **Analyse-** und Entwickler-Tools: ^Unix/Linux ^^ |ar |Libraries modifizieren / anzeigen lassen, etc. | |dump | | |ldd |Abhängigkeiten eines ausführbares Programms / einer (dynamischen) Library anzeigen lassen. | |nm |Inhalt (Symbols) einer Library / Executable anzeigen lassen. | |binscan |Abhängigkeiten eines ausführbares Programms / einer (dynamischen) Library anzeigen lassen, mit GUI.\\ [[https://sourceforge.net/projects/binscan/]] | |ELF Library Viewer\\ (Think of it as a graphical ldd program.)|Abhängigkeiten eines ausführbares Programms / einer (dynamischen) Library anzeigen lassen, mit GUI.\\ [[http://www.purinchu.net/software/elflibviewer.php]] | | | | ^Windows ^^ |dumpbin.exe\\ lib.exe |Libraries modifizieren / anzeigen lassen, etc. | |Dependency Walker |Abhängigkeiten in DLLs ermitteln. | |Beyond Compare |Textdateien (Quelltexte) und Ordner vergleichen, um Unterschiede aufzuspüren und abzugleichen. | Statische Code-Analyse (Info unter[[https://de.wikipedia.org/wiki/Statische_Code-Analyse]]): * **C** - Splint: [[https://de.wikipedia.org/wiki/Splint_(Software)]] * **C++** - Cppcheck: [[https://de.wikipedia.org/wiki/Cppcheck]] Dynamische Code-Analyse (Info unter[[https://de.wikipedia.org/wiki/Dynamisches_Software-Testverfahren]]): * **Valgrind** (Memcheck): * Teil 1: [[https://www.heise.de/developer/artikel/Einfuehrung-in-die-Arbeit-mit-Valgrind-und-Memcheck-Teil-1-2480976.html]] * Teil 2: [[https://www.heise.de/developer/artikel/Einfuehrung-in-die-Arbeit-mit-Valgrind-und-Memcheck-Teil-2-2488710.html]] ===== Spezielle Themenbereiche ===== [[EDV:PRG:C:64-Bit-Architektur]] - Datenmodelle (LLP64/LP64/ILP64/SILP64), Bit-Breite von Integer-Datentypen [[EDV:PRG:C:ELF]] - Executable and Linking Format (Unix) [[EDV:PRG:C:Library|Statische Libraries]] * (VisualStudio) Walkthrough: Creating and Using a Static Library (C++)\\ [[https://docs.microsoft.com/de-de/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=vs-2019]] [[EDV:PRG:C:DLLs|DLLs / dynamische Libraries / DSOs / shared libraries]] * (VisualStudio) Walkthrough: Create and use your own Dynamic Link Library (C++)\\ [[https://docs.microsoft.com/de-de/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2019]] [[EDV:PRG:C:CPU-Typ identifizieren]] * Google gibt Code zur CPU-Funktionsanalyse frei: [[http://www.linux-magazin.de/news/google-gibt-code-zur-cpu-funktionsanalyse-frei/]] * **cpu_features** auf Github: [[https://github.com/google/cpu_features]] **Sanitizer** (deutsch "Desinfektionsmittel"): [[https://github.com/google/sanitizers]] - AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer. ===== Allgemeine Tipps: ===== [[EDV:PRG:C:Tipp:Vordefinierte Präprozessor-Direktiven]] (ANSI C), **Makros** (Predefined Macros) und **String-Literal**-Operator [[EDV:PRG:C:Tipp:Big-Endian und Little-Endian]], Unbedingt beachten: [[https://de.wikipedia.org/wiki/Byte-Reihenfolge#Plattform.C3.BCbergreifende_Darstellung_von_Zahlen|Plattformübergreifende Darstellung von Zahlen]] (insbesondere bei der seriellen Übertragung) [[EDV:PRG:C:Tipp:Makros-Kollisionen]] vermeiden [[EDV:PRG:C:Tipp:Plattform-Makros]] für Plattform- und Compilerübergreifende Programme (Stichwort: Portabilität) (FIXME) [[EDV:PRG:C:Tipp:Einbetten von Versionsinformationen]] (FIXME) [[EDV:OS:UNIX:Signale]] (nur UNIX/Linux) [[EDV:PRG:C:man:Dynamische Speicherverwaltung]] - malloc(), calloc(), realloc(), free(), alloca(); Hinweise für Portierung von 32- auf 64-Bit (**32-/64-Bit** Pointer). [[EDV:PRG:C:man:Zugriff auf das FileSystem]] - stat(), rename(), remove(), chmod(), access(), utime(), getcwd(), mkdir(), rmdir(), chdir(), realpath(), dirname() und basename(), opendir(), readdir() und readdir_r(), closedir(), etc. (FIXME) [[EDV:PRG:C:Tipp:errno]] - :!: Es gibt einiges zu beachten! [[EDV:PRG:C:Tipp:Zeit-Funktionen]] - time(), localtime(), localtime_s(), localtime_r(), clock(), clock_gettime(), TZ, etc. und weitere Beispiele (FIXME) [[EDV:PRG:C:Tipp:Funktionen mit variabler Anzahl von Parameter]] (FIXME) [[EDV:PRG:C:Example:Bit-Operatoren]] [[EDV:PRG:C:Example:Operationen mit Strings]] (FIXME) [[EDV:PRG:C:man:Makros min() und max()]] [[EDV:PRG:C:man:Makro offsetof()]] Vorsicht bei Verwendung von **[[http://man7.org/linux/man-pages/man3/putenv.3.html|putenv()]]** - es kann zu memory leaks führen! Stattdessen die **[[http://man7.org/linux/man-pages/man3/setenv.3.html|setenv()]]** verwenden.\\ Warum, wird hier ausführlich erklärt: [[http://stackoverflow.com/questions/5873029/questions-about-putenv-and-setenv]]\\ ...oder auch hier: [[http://www.greenend.org.uk/rjk/tech/putenv.html]] [[http://www.lcs-chemie.de/ddd.htm|Kurzanleitung für Debugger DDD / KDbg]] [[EDV:PRG:C:Example:backslash2slash.sh]] Ein kurzes Skript für die Portierung auf Unix - ersetzt alle Back-Slashes in den "#include"-Direktiven (.c- und .h-Files) durch Slashes. **[[EDV:PRG:Sichere Programmierung]]** - Hier findet man ebenfalls einige nützliche Hinweise. [[Extern linkage und C language linkage]] :!: Das Schlüsselwort [[EDV:PRG:CPP:Keywords:explicit]] //(Seit C++11)// verhindert implizite Typumwandlungen (beim Constructor) :!: Funktionen, die ausschließlich innerhalb eines Modules verwendet werden, sollen mit dem Schlusselwort **%%static%%** deklariert werden. Das schränkt die Sichtbarkeit solcher Funktionen auf das jeweilige Modul (sprich auf ein ".c"-File). Es beugt den evtl. Namenskonflikten vor, wenn z.B. mehrere Module für ihre Funktionen gleiche Namen verwenden. ==== Datentypen ==== [[EDV:PRG:C:DataTyp:Data Type Ranges]] [[EDV:PRG:CPP:DataTyp:Datentype für Zeichen und Strings]] FIXME - char, wchar_t, char16_t, char32_t, u16string, u32string [[EDV:PRG:C:DataTyp:printf() - Formatierungszeichen]] (Formatzeichen, Steuerzeichen, Escape-Sequenzen) FIXME [[EDV:PRG:C:DataTyp:Definition von neuen Datentypen]] (mit "typedef", "#define", Probleme bei anonymen Typen, etc.) **GMP** - The **G**NU **M**ultiple **P**recision Arithmetic Library: [[https://de.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library]] * Offizielle GMP Website: [[https://gmplib.org/]]\\ //GMP is a free library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating-point numbers. There is no practical limit to the precision except the ones implied by the available memory in the machine GMP runs on.// * Anwendungsbeispiel:\\ Computing billions of π digits using GMP: [[https://gmplib.org/pi-with-gmp.html]] Tuple: [[https://dieboostcppbibliotheken.de/boost.tuple]] ===== Programmbeispiele in C: ===== [[EDV:PRG:C:C lernen]] - Einige Beispiele und Übungen. (FIXME) :!: Die meisten Beispiele sind vereinfacht dargestellt. Sie sollen nicht als konkrete und fertige Lösungen verstanden werden, sondern vielmehr als Lösungsansätze, die zu einer Lösung in jeweiligen konkreten Fällen führen. [[EDV:PRG:C:Example:Signalbehandlung]] [[EDV:PRG:C:Example:Aktuellen Timestamp erfassen]] [[EDV:PRG:C:Example:Zeitabstände messen]] bzw. Laufzeit eines Programms / einer Funktion berechnen [[EDV:PRG:C:Example:Kommunikation über Named Pipes]] [[EDV:PRG:C:Example:Zufällige int-Zahl]] [[EDV:PRG:C:Example:Textfile öffnen - mit Versuchszähler]], Basisfunktion: [[EDV:PRG:C:stdio.h:fopen()]] [[EDV:PRG:C:Example:Textfile schließen/löschen - mit Versuchszähler]] [[EDV:PRG:C:Example:Textfile lesen 01|Textfile lesen]] [[EDV:PRG:C:Example:Aus mehreren Files blockweise lesen]], Basisfunktion: [[EDV:PRG:C:stdio.h:fread()]] FIXME [[EDV:PRG:C:Example:logging_ext]]: Logging-Modul - nützliche Log-Funktionen (FIXME) [[EDV:PRG:C:Example:trim_ext]]: Trim-Modul - Funktionen um die Leerzeichen vorne und hinten bei einem String wegschneiden [[EDV:PRG:C:Example:Array of Messages]]: Alle Messages, die ein Programm ausgibt, an einer Stelle zusammen halten [[EDV:PRG:C:Example:Zweidimensionale dynamische Arrays]] [[EDV:PRG:C:Example:Beispiel CPU-Time Funktionen]] [[EDV:PRG:C:Example:Vorlage C-Programm]]: Ein Gerüst für ein C-Programm [[EDV:PRG:C:Example:Debug-Makros]] - Einige nützliche Beispiele, die sich beim "Debuggen" als hilfreich erwiesen haben [[EDV:PRG:C:Example:Environment lesen]] - Verschiedene Wege, die Environment-Variablen zu lesen Parsing Program Arguments: [[http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#Parsing-Program-Arguments]] (getopt / argp_parse / suboptions) [[EDV:PRG:C:Example:get_CurrentExecutable()]] - Filename des gerade ausgeführten Moduls herausfinden uname() - get name and information about current kernel: [[http://man7.org/linux/man-pages/man2/uname.2.html]] * **Zeichenweise** lesen aus **stdin** mit **getchar()** (und schreiben auf "stdout" mit "putchar()") und ein etwas portableres **getch()**:\\ [[http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_006.htm#t2t32]] * **Zeichenweise** lesen **dateiorientiert** mit **getc()** bzw. **fgetc()** (und schreiben mit "putc()" bzw. "fputc()"):\\ [[http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_007.htm]] * **Zeilenweise** lesen mit **gets()** bzw. **fgets()** (und schreiben mit "puts()" bzw. "fputs()"):\\ [[http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_016.htm#t2t32]] * **Zeilenweise** einlesen vom Stream mit **getline()** (nicht ANSI C):\\ [[http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_016.htm#t2t34]] * **Ncurses** (C-Bibliothek für die Steuerung von Textterminals): [[https://de.wikibooks.org/wiki/Ncurses]] * Ncurses-Doku als PDF: [[https://upload.wikimedia.org/wikibooks/de/b/b3/Ncurses.pdf]] ===== Programmbeispiele in C++: ===== [[EDV:PRG:CPP:Crashkurs|C++ Crashkurs]] - Einige Beispiele / Übungen. [[EDV:PRG:CPP:Example:static_assert()]] (C++11) [[EDV:PRG:CPP:Example:Auf der Kommandozeile übergebene Parameter parsen]] [[EDV:PRG:CPP:Example:Aktuellen Timestamp erfassen]] [[EDV:PRG:CPP:Example:Trim]] [[EDV:PRG:CPP:Example:Stringutils]] - Helper rund um die Strings (trim, trim_left, trim_right, pad_left, pad_right, to_upper, replace, compare_nocase, split, split_lines) [[EDV:PRG:CPP:Example:Fileutils]] [[EDV:PRG:CPP:Example:"Spontan" auf eine dynamische Library zugreifen]] **Zeit** in C++20: Kalendertermine erstellen: [[https://www.heise.de/blog/Zeit-in-C-20-Kalendertermine-erstellen-9671530.html?wt_mc=nl.red.ho.ho-nl-newsticker.2024-04-09.link.link]]\\ //(Der Artikel taucht tiefer in das Konzept von Kalenderdaten in C++ ein und zeigt, wie man sie erstellt.)// :!: Vorsicht bei der **[[EDV:PRG:CPP:Example:Zuweisung eines Objekts an Static Member einer Klasse]]**! (Relevant für den GNU-Compiler) :!: Vorsicht bei der **[[EDV:PRG:CPP:Example:Initialisierung eines Objekts bei dessen Deklaration]]**! (Relevant für den GNU-Compiler) :!: [[EDV:PRG:CPP:Example:Export von Klassen/Strukturen/Methoden/Funktionen, die STL-Objekte (oder Templates allgemein) als Member/Parameter verwenden]] (insbesondere für DLLs relevant) Size of array: * Suche: [[http://www.bing.com/search?q=c%2B%2B+size+of+array]] * How to get the size of an Array? [[http://stackoverflow.com/questions/874169/how-to-get-the-size-of-an-array]] :!: Achtung! Das Schlüsselwort **abstract** (um virtuelle Methoden als abstrakte Methoden zu gekennzeichnen) kann zwar in MS VisualStudio verwendet werden, ist jedoch nicht Bestandteil von C++! Stattdessen, insbesondere für den portablen Code, die C++ Notation verwenden:virtual type_of_method pure_virtual() = 0;\\ Hier ist die Info auf MSDN: * [[https://msdn.microsoft.com/en-us/library/xey702bw%28v=vs.120%29.aspx|Component Extensions for Runtime Platforms]] (englisch) * [[https://msdn.microsoft.com/en-us/library/b0z6b513%28v=vs.120%29.aspx|abstract (C++ Component Extensions)]] (englisch) * [[https://msdn.microsoft.com/de-de/library/b0z6b513%28v=vs.120%29.aspx|abstract (Komponentenerweiterungen für C++)]] (deutsch) ...und auf [[http://www.programmerinterview.com/]]: * [[http://www.programmerinterview.com/index.php/c-cplusplus/c-abstract-keyword/|Does C++ have a keyword for "abstract"?]] (englisch) * [[http://www.programmerinterview.com/index.php/c-cplusplus/pure-virtual-function/|What is a pure virtual function?]] (englisch) Die [[EDV:PRG:CPP:Example:xxxxxx_s()]]-Funktionen nachbauen - memcpy_s(), strcpy_s(), strncpy_s() ===== Externe Links zum Thema: ===== :!: Linux C++ Software Development: [[http://www.yolinux.com/TUTORIALS/LinuxTutorialC++.html]] - Links to Linux C++ GUI frameworks, APIs, IDEs, as well as C++ tips for Linux developers. [[http://www.willemer.de/informatik/unix/unprfork.htm]] - Arnold Willemer: **Programmierung UNIX-Prozesse** [[http://pronix.linuxdelta.de/C/Linuxprogrammierung/index.shtml]] - Jürgen Wolf: **Linux/Unix-Systemprogrammierung** [[http://www.minet.uni-jena.de/dbis/lehre/ws2006/c-c++/slides6.pdf]] - Knut Stolze: Systemnahe Programmierung in C/C++ - **Interprozesskommunikation (IPC)** - [[http://www.fbi.h-da.de/~a.schuette/Vorlesungen/Unix/Skript/C-Programmierung/Interprozesskommunikation.pdf]] - Prof. Dr. Alois Schütte: Unix für Entwickler: **Interprozesskommunikation** [[http://www2.fh-fulda.de/~gross/parallel.bachelor/kap2.pdf]] - Prof. Dr. S.Groß: **Parallelverarbeitung** **Unix domain socket**:\\ in [[http://en.wikipedia.org/wiki/Unix_domain_socket|Wikipedia]] (englisch), [[http://de.wikipedia.org/wiki/POSIX_local_inter-process_communication_socket|Wikipedia]] (deutsch), und unter [[http://www.netzmafia.de/skripten/server/ThomasSocket2.pdf]] Artikel zu C und C++: [[http://www.kompf.de/cplus/artikel/index.html]] Linux System Call Table (eine Tabelle mit den **Linux-Syscalls** für 64-Bit-Systeme): [[http://thevivekpandey.github.io/posts/2017-09-25-linux-system-calls.html]]\\ (Code hosted at [[https://github.com/thevivekpandey/syscalls-table-64bit]]) ==== C ==== [[http://pronix.linuxdelta.de/C/standard_C/index.shtml]] - Jürgen Wolf: **C von A bis Z** (Online-Version des Buches) [[http://www2.fh-fulda.de/~klingebiel/c-stdlib/]] - Axel Stutz, Peter Klingebiel, FH Fulda, DVZ: **Übersicht über die C Standard-Bibliothek** (//, , , , , , , , , , , //) ==== C++ ==== C++ Standards Support in GCC (Welche C++ Eigenschaften ab welchen GCC Versionen verfügbar sind):\\ [[https://gcc.gnu.org/projects/cxx-status.html]] **C++11:** * C11: Neue Version der Programmiersprache (2012) * Teil 1: [[http://www.heise.de/developer/artikel/C11-Neue-Version-der-Programmiersprache-Teil-1-1661014.html]] * FIXME * C++11-Standard: Was ist neu? [[https://www.informatik-aktuell.de/entwicklung/programmiersprachen/c-uebersicht-der-neuerungen-des-standards-in-der-version-11.html]] [[http://www.cplusplus.com/]] - Umfangreiche Sammlung von Tutorials, C++Referenzen und Artikeln. Ein Forum ist auch dabei (englisch).\\ **C++Reference:** [[http://www.cplusplus.com/reference/]]\\ \\ Hier einzeln: * [[http://www.cplusplus.com/reference/clibrary/|C library]] * [[http://www.cplusplus.com/reference/stl/|Containers]] * [[http://www.cplusplus.com/reference/iolibrary/|Input/Output]] * [[http://www.cplusplus.com/reference/multithreading/|Multi-threading]] [[http://ladedu.com/cpp/]] - Heinz Tschabitscher: **Einführung in C++-Programmierung** Generische Programmierung (**Templates**): [[http://www.willemer.de/informatik/cpp/cpptempl.htm]] **Modernes C++ in der Praxis** (von Rainer Grimm): * Folge 1: [[http://www.linux-magazin.de/Ausgaben/2011/12/C-11/]] - Die Elf spielt auf * Folge 2: [[http://www.linux-magazin.de/Ausgaben/2012/02/C-11/]] - Lambda-Funktionen * Folge 3: [[http://www.linux-magazin.de/Ausgaben/2012/04/C-11/]] - Mehrgleisig unterwegs (Multithreading-Fähigkeit) * Folge 4: [[http://www.linux-magazin.de/Ausgaben/2012/06/C-11/]] - Gemeinsam ins Ziel (mehrere Threads) * Folge 5: [[http://www.linux-magazin.de/Ausgaben/2012/08/C-11/]] - Im Gleichtakt (Synchronisieren von Threads) * Folge 6: [[http://www.linux-magazin.de/Ausgaben/2012/10/C-11/]] - Alle im Einklang (Promise und Future - Synchronisation mehrerer Threads) * Folge 7: [[http://www.linux-magazin.de/Ausgaben/2012/12/C-11/]] - Rasch verschoben * Folge 8: [[http://www.linux-magazin.de/Ausgaben/2013/02/C-11/]] - Räumkommando (Unique Pointer) * Folge 9: [[http://www.linux-magazin.de/Ausgaben/2013/04/C-11/]] - Klug aufgeräumt (Smart Pointer) * Folge 10: [[http://www.linux-magazin.de/Ausgaben/2013/06/C-11/]] - Zähl mich! (reguläre Ausdrücke) * Folge 11: [[http://www.linux-magazin.de/Ausgaben/2013/08/C-11/]] - Starke Ausdrücke (reguläre Ausdrücke) * Folge 12: [[http://www.linux-magazin.de/Ausgaben/2013/10/C-11/]] - Suchen und ersetzen (reguläre Ausdrücke) * Folge 13: [[http://www.linux-magazin.de/Ausgaben/2013/12/C-11/]] - Geschwindigkeit zählt (Hashtabellen) * Folge 14: [[http://www.linux-magazin.de/Ausgaben/2014/02/C-11/]] - Neue Ausdruckskraft (Range-basierte For-Schleife) * Folge 15: [[http://www.linux-magazin.de/Ausgaben/2014/04/C-11/]] - C++11 + 3 = C++14 * Folge 16: [[http://www.linux-magazin.de/Ausgaben/2014/06/C-11/]] - Der Vertrag (Memory-Modell, atomare Variablen) * Folge 17: [[http://www.linux-magazin.de/Ausgaben/2014/08/C-11/]] - Automatik mit Methode * Folge 18: [[http://www.linux-magazin.de/Ausgaben/2014/10/C-11/]] - Schönes Objekt * Folge 19: [[http://www.linux-magazin.de/Ausgaben/2014/12/C-11/]] - Kurs zum Mars (neue Literale: Raw-String- und benutzerdefinierte Literale) * Folge 20: [[http://www.linux-magazin.de/Ausgaben/2015/02/C-11/]] - Statisch geprüft (static_assert() und die Type-Traits-Bibliothek) * Folge 21: [[http://www.linux-magazin.de/Ausgaben/2015/04/C-11/]] - Für vorsichtige Raser (Type-Traits-Bibliothek) * Folge 22: [[http://www.linux-magazin.de/Ausgaben/2015/06/C-11/]] - Konstante Magie ("constexpr") * Folge 23: [[http://www.linux-magazin.de/Ausgaben/2015/08/C-11/]] - Punktlandung (Variadic Templates) * Folge 24: [[http://www.linux-magazin.de/Ausgaben/2015/10/C-11/]] - Containerverwaltung * Folge 25: [[http://www.linux-magazin.de/Ausgaben/2015/12/C-11/]] - Der Reihe nach verpackt (Containern) * Folge 26: [[http://www.linux-magazin.de/Ausgaben/2016/02/C-11/]] - Doppelte Packung (die Referenz-Wrapper) * Folge 27: [[http://www.linux-magazin.de/Ausgaben/2016/04/C-11/]] - Die Zeit verstehen (Zeitbibliothek) * Folge 28: [[http://www.linux-magazin.de/Ausgaben/2016/06/C-11/]] - Pünktlich verschlafen (Zeitbibliothek) * Folge 29: [[http://www.linux-magazin.de/Ausgaben/2016/08/C/]] - Zukunftsmusik * Folge 30: [[http://www.linux-magazin.de/Ausgaben/2016/10/C/]] - Bibliotheks-Karriere * Folge 31: [[http://www.linux-magazin.de/Ausgaben/2016/12/C/]] - Von der Theorie zur Praxis * Folge 32: [[http://www.linux-magazin.de/Ausgaben/2017/02/C/]] - Delinquente Typen * Folge 33: [[http://www.linux-magazin.de/Ausgaben/2017/04/C/]] - Programmiere deklarativ * Folge 34: [[http://www.linux-magazin.de/Ausgaben/2017/06/C/]] - Selbstoptimiert (Move-Semantik und konstanten Ausdrücken) * Folge 35: [[http://www.linux-magazin.de/Ausgaben/2017/08/C/]] - Compiler first! * Folge 36: [[http://www.linux-magazin.de/Ausgaben/2017/10/C]] - Crash nach Flash * Folge 37: [[http://www.linux-magazin.de/Ausgaben/2017/12/C]] - Kein Verlass * Folge 38: [[http://www.linux-magazin.de/ausgaben/2018/02/c/]] - (über Lesbarkeit von Code) FIXME * Folge 39: [[http://www.linux-magazin.de/ausgaben/2018/04/c/]] - (über "static_assert") FIXME * Folge 40: [[http://www.linux-magazin.de/ausgaben/2018/06/c-2/]] - Kenne deine Bibliotheken * Folge 41: [[http://www.linux-magazin.de/ausgaben/2018/08/c-3/]] - Strebe nach Einfachheit * FIXME Blog **Modernes C++** von Rainer Grimm auf Heise: [[https://www.heise.de/developer/ModernesCplusplus-3691794.html]] [[http://de.wikipedia.org/wiki/Boost_(C%2B%2B-Bibliothek)|Boost (C++-Bibliothek)]] - Eine __freie__ C++-Bibliothek, die aus einer Vielzahl von __portablen__ Unterbibliotheken besteht.\\ Online-Buch **Die Boost C++ Bibliotheken** (deutsch): [[http://www.highscore.de/cpp/boost/]] [[http://msdn.microsoft.com/en-us/library/hh279654(v=vs.110).aspx]] - MSDN: Welcome Back to C++ (Modern C++) [[http://www.angelikalanger.com/Articles/Topics.html#CPP]] - Angelika Langer: C++ Articles (in verschiedenen Sprachen)\\ [[http://www.angelikalanger.com/Articles/ObjektSpektrum/C++Templates/C++Templates.html| Programmieren mit C++ Templates]]\\ [[http://www.angelikalanger.com/Articles/Elektronik/ReliableC++/ResourceAllocation.html|Fehlerfreies Programmieren in C++ - Dynamische Allokation von Ressourcen]] In der Klasse "std::string" fehlt die **trim**-Funktion. Im Thread [[http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring|What's the best way to trim std::string]] auf [[http://stackoverflow.com/]] wird über verschiedene Lösungsansätze diskutiert. Performance Unterschied von **std::vector** und **std::list**: [[http://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html]] static_cast, const_cast, dynamic_cast, reinterpret_cast und C-Casts: [[https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_N%C3%BCtzliches/_Casts]] Herb Sutter - Elements of Modern C++ Style: [[http://herbsutter.com/elements-of-modern-c-style/]] - Neuerungen in C++11 gegenüber C++98. C++/11: Eine Einführung in **Lambda** Funktionen: [[http://www.indiedev.de/wiki/C%2B%2B/11:_Eine_Einf%C3%BChrung_in_Lambda_Funktionen]] MSDN: **Lambda**-Ausdrücke in C++: [[http://msdn.microsoft.com/de-de/library/dd293608.aspx]] :!: **UnitTests** (Microsoft.VisualStudio.TestTools.CppUnitTestFramework): [[http://jk-wiki.kreick.de/doku.php?id=edv:prg:ide:msvisualstudio#unittest]] **SEH** (**S**tructured **E**xception **H**andling): [[https://msdn.microsoft.com/de-de/library/swezty51(v=vs.120).aspx]] **libstdc++** Source Documentation: [[https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/]] * Namespace List: [[https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html]] * **std** Namespace Reference: [[https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01616.html]] Warum **using** ein besserer **typedef** ist? Hier ist die Antwort: [[https://stackoverflow.com/questions/10747810/what-is-the-difference-between-typedef-and-using-in-c11]]\\ (The **using** syntax has an advantage when used within templates.) Entwurfsmuster Singleton Pattern: [[https://cplusplus-development.de/c/cplusplus-erweitert/entwurfsmuster-singleton-pattern]] ==== UTF8 ==== [[http://www.cprogramming.com/tutorial/unicode.html|Unicode in C and C++: What You Can Do About It Today]] (englisch) von [[webmaster@cprogramming.com|: Alex Allain]] [[http://www.evanjones.ca/unicode-in-c.html|Using Unicode in C/C++]] (englisch) von [[evanj@csail.mit.edu|: Evan Jones]] :!: Eine hilfreiche Tabelle mit **Unicode**-/**UTF8**-Zeichen: [[http://www.utf8-zeichentabelle.de/]] Weitere Tabelle: [[http://www.isthisthingon.org/unicode/index.php]] ==== Shared Memory ==== MSDN: [[http://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx|Creating Named Shared Memory]] MSDN: [[http://msdn.microsoft.com/en-us/library/ms686958(v=vs.85).aspx|Using Shared Memory in a Dynamic-Link Library]] ==== Filesystem ==== ADMIN-Tipp: [[http://www.admin-magazin.de/News/Tipps/ADMIN-Tipp-Dateiaenderungen-ueberwachen?utm_source=ADMIN+Newsletter&utm_campaign=ADMIN-Newsletter-2013-27&utm_medium=email|Dateiänderungen überwachen]] von Oliver Frommel\\ //Die Inotify-Schnittstelle des Linux-Kernels erlaubt es, Dateien und Verzeichnisse im Blick zu behalten. Mit der Python-API lassen sich dafür eigene Skripte schreiben.// ==== Resource-Files (nur Windows) ==== MinGW: * windres: [[https://sourceware.org/binutils/docs/binutils/windres.html]] * MS resource compiler: [[http://www.mingw.org/wiki/MS_resource_compiler]] Auf MSDN: * VERSIONINFO resource: [[https://msdn.microsoft.com/en-us/library/windows/desktop/aa381058(v=vs.85).aspx]] * Using RC (The RC Command Line): [[https://msdn.microsoft.com/en-us/library/windows/desktop/aa381055(v=vs.85).aspx]] ==== Verschlüsselung ==== === mit OpenSSL === Oliver Müller auf "Heise Developer":\\ **OpenSSL: Implementierung innerhalb eines Client- und Server-Programms** (2010) * Teil 1, **Schlüsselfertig**:\\ [[http://www.heise.de/developer/artikel/OpenSSL-Implementierung-innerhalb-eines-Client-und-Server-Programms-Teil-1-1050619.html]] * Teil 2, **Aufgeschlossen**:\\ [[http://www.heise.de/developer/artikel/OpenSSL-Implementierung-innerhalb-eines-Client-und-Server-Programms-Teil-2-1058771.html]] * Teil 3, **Fehlerträchtig**:\\ [[http://www.heise.de/developer/artikel/OpenSSL-Implementierung-innerhalb-eines-Client-und-Server-Programms-Teil-3-1157455.html]] * Teil 4, **Mehrspurig**:\\ [[http://www.heise.de/developer/artikel/OpenSSL-Implementierung-innerhalb-eines-Client-und-Server-Programms-Teil-4-1157918.html]] === mit Boost.Asio === Oliver Müller auf "Heise Developer":\\ **SSL/TLS-Netzwerkprogrammierung mit Boost.Asio** (2016) * Teil 1, **Grundlagen** (Auftrieb):\\ [[http://www.heise.de/developer/artikel/SSL-TLS-Netzwerkprogrammierung-mit-Boost-Asio-Teil-1-Grundlagen-3081443.html]] * Teil 2, **Server-Programmierung** (Praktischer Auftrieb für SSL):\\ [[http://www.heise.de/developer/artikel/SSL-TLS-Netzwerkprogrammierung-mit-Boost-Asio-Teil-2-Server-Programmierung-3102667.html]] * Teil 3, **Client-Programmierung und Fehlerbehandlung** (Portabler Auftrieb):\\ [[http://www.heise.de/developer/artikel/SSL-TLS-Netzwerkprogrammierung-mit-Boost-Asio-Teil-3-Client-Programmierung-und-Fehlerbehandlung-3161904.html]] ==== Netzwerk ==== **cURL** (Client for URLs): [[https://de.wikipedia.org/wiki/CURL]] - ein Kommandozeilen-Programm zum Übertragen von Dateien in Netzwerken.\\ (cURL bzw. **libcurl** kann auch als Ersatz bzw. Nachfolger für **libwww** betrachtet werden.) * **curl** - command line tool and library: [[https://curl.haxx.se/]] * **libcurl** - the multiprotocol file transfer library: [[https://curl.haxx.se/libcurl/]] * libcurl - small example snippets: [[https://curl.haxx.se/libcurl/c/example.html]] * libcurl - programming tutorial: [[https://curl.haxx.se/libcurl/c/libcurl-tutorial.html]] **libwww** (**Lib**rary **W**orld **W**ide **W**eb): [[https://en.wikipedia.org/wiki/Libwww]] - modulares client-seitiges Web-API für Unix und Windows.\\ (Sehr veraltet, letzter Release 12.2006.) * Libwww Architecture: [[https://www.w3.org/Library/User/Architecture/Overview.html]] * Libwww Ready to go Samples: [[https://www.w3.org/Library/Examples/]] ==== Threads ==== :!: Das Abarbeiten mehrerer Threads innerhalb eines Prozesses wurde mit dem **C++11**-Standard eingeführt. [[EDV:PRG:C:Tipp:Client-Server mit Threads]] (:!: ToDo) [[EDV:PRG:C:Tipp:Tips und Tricks zu Threads]] (FIXME) Eine Einführung in die Programmierung von Threads unter Linux: [[http://www.ijon.de/comp/tutorials/threads/index.html]] von Michael Becker (2001) :!: Beim Kompilieren (mit GCC) den Schalter "**-pthread**" nicht vergessen! Dieser Schalter aktiviert ein (oder mehrere?) Define (zumindest "**_GLIBCXX_HAS_GTHREADS**"), damit der Compiler in den Header-Files in passende Zweige hinein läuft. Parallele Programmierung - PThread (POSIX-Threads), OpenMP (Open Multi Processing), MPI (Message Passing Interface):\\ [[https://pc2.uni-paderborn.de/fileadmin/pc2/media/staffweb/Jens_Simon/Courses/WS08_APR/ParalleleProgrammierung.pdf]] Jürgen Wolf, **C von A bis Z** - Das umfassende Handbuch: Kapitel "26.4 Mit den POSIX-Threads programmieren"\\ [[http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/026_c_paralleles_rechnen_004.htm]] :!: "Windows Threads vs pthreads" (meine Übersetzung aus [[https://stackoverflow.com/questions/5644912/posix-threads-vs-win32-threads]]):\\ Interface-mäßig unterscheiden sich die beiden Thread-Arten wenig. Sie könnte man fast 1:1 mappen. (Stichwort: "pthreads-win32".) Das wärs aber.\\ Die Posix-Threads sind alle Calls der Library "pthreads", die wiederum (auf Unix/Linux-Systemen) LowLevel-System-Calls tätigen. Die Win32-Threads sind System-Calls. Ein sehr ausführlicher Artikel zum Thema (Stand: 31.03.2006):\\ [[https://www.uni-kassel.de/eecs/fileadmin/datas/fb16/Fachgebiete/PLM/Dokumente/Master_Bachelor_Diplom/tobias_gunkel_threading_systems.pdf]] Synchronisation von Threads: [[https://www.grimm-jaud.de/index.php/blog/bedingungsvariablen-versus-tasks-zur-synchronisation-von-threads]] C++ Keyword **thread_local** (ab C++11): [[https://en.cppreference.com/w/cpp/keyword/thread_local]] Lesenswerte Artikel zum Thema aus dem Blog von Rainer Grimm auf Heise: * 23.04.2018: [[https://www.heise.de/developer/artikel/C-Core-Guidelines-Regeln-zur-Concurrency-und-zur-Parallelitaet-4029126.html|Regeln zur Concurrency und zur Parallelität]] * 30.04.2018: [[https://www.heise.de/developer/artikel/C-Core-Guidelines-Mehr-Regeln-zur-Concurrency-und-zur-Parallelitaet-4037436.html|Mehr Regeln zur Concurrency und zur Parallelität]] * 14.05.2018: [[https://www.heise.de/developer/artikel/C-Core-Guidelines-Teilen-von-Daten-zwischen-Threads-4047784.html|Teilen von Daten zwischen Threads]] * 21.05.2018: [[https://www.heise.de/developer/artikel/C-Core-Guidelines-Sich-um-Kinder-Threads-kuemmern-4052631.html|Sich um Kinder-Threads kümmern]] * 28.05.2018: [[https://www.heise.de/developer/artikel/C-Core-Guidelines-Mehr-Fallen-in-der-Concurrency-4058357.html|Mehr Fallen in der Concurrency]] * 04.06.2018: [[https://www.heise.de/developer/artikel/C-Core-Guidelines-Sei-dir-der-Fallen-von-Bedingungsvariablen-bewusst-4063822.html|Sei dir der Fallen von Bedingungsvariablen bewusst]] * 25.06.2018: [[https://www.heise.de/developer/artikel/Concurrency-und-lock-freies-Programmieren-4090498.html|Concurrency und lock-freies Programmieren]] ==== Sonstiges ==== **JSON**-Parser: Library "jsoncpp" - [[https://github.com/open-source-parsers/jsoncpp]] ---- Stand: 09.04.2024 EOF