Benutzer-Werkzeuge

Webseiten-Werkzeuge


edv:prg:c

Programmierung in C/C++

Einige allgemeine Infos zu den Sprachen C/C++ und deren Authoren:


.

Infos zum Kompilieren/Linken sind unter GCC, Make (für die GNU Compiler Collection) und MS Visual Studio (für den Microsoft Compiler) zu finden.

Compatibility of C and C++: https://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

Siehe auch 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 unterhttps://de.wikipedia.org/wiki/Statische_Code-Analyse):

Dynamische Code-Analyse (Info unterhttps://de.wikipedia.org/wiki/Dynamisches_Software-Testverfahren):

Spezielle Themenbereiche

64-Bit-Architektur - Datenmodelle (LLP64/LP64/ILP64/SILP64), Bit-Breite von Integer-Datentypen

ELF - Executable and Linking Format (Unix)

Statische Libraries

DLLs / dynamische Libraries / DSOs / shared libraries

CPU-Typ identifizieren

Sanitizer (deutsch "Desinfektionsmittel"): https://github.com/google/sanitizers - AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer.

Allgemeine Tipps:

Vordefinierte Präprozessor-Direktiven (ANSI C), Makros (Predefined Macros) und String-Literal-Operator

Big-Endian und Little-Endian, Unbedingt beachten: Plattformübergreifende Darstellung von Zahlen (insbesondere bei der seriellen Übertragung)

Makros-Kollisionen vermeiden

Plattform-Makros für Plattform- und Compilerübergreifende Programme (Stichwort: Portabilität) (FIXME)

Einbetten von Versionsinformationen (FIXME)

Signale (nur UNIX/Linux)

Dynamische Speicherverwaltung - malloc(), calloc(), realloc(), free(), alloca(); Hinweise für Portierung von 32- auf 64-Bit (32-/64-Bit Pointer).

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)

errno - :!: Es gibt einiges zu beachten!

Zeit-Funktionen - time(), localtime(), localtime_s(), localtime_r(), clock(), clock_gettime(), TZ, etc. und weitere Beispiele (FIXME)

Funktionen mit variabler Anzahl von Parameter (FIXME)

Bit-Operatoren

Operationen mit Strings (FIXME)

Makros min() und max()

Makro offsetof()

Vorsicht bei Verwendung von putenv() - es kann zu memory leaks führen! Stattdessen die 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

Kurzanleitung für Debugger DDD / KDbg

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.

Sichere Programmierung - Hier findet man ebenfalls einige nützliche Hinweise.

Extern linkage und C language linkage

:!: Das Schlüsselwort 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

Data Type Ranges

Datentype für Zeichen und Strings FIXME - char, wchar_t, char16_t, char32_t, u16string, u32string

printf() - Formatierungszeichen (Formatzeichen, Steuerzeichen, Escape-Sequenzen) FIXME

Definition von neuen Datentypen (mit "typedef", "#define", Probleme bei anonymen Typen, etc.)

GMP - The GNU Multiple Precision 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:

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.

Signalbehandlung

Aktuellen Timestamp erfassen

Zeitabstände messen bzw. Laufzeit eines Programms / einer Funktion berechnen

Kommunikation über Named Pipes

Zufällige int-Zahl

Textfile öffnen - mit Versuchszähler, Basisfunktion: fopen()

Textfile schließen/löschen - mit Versuchszähler

Textfile lesen

Aus mehreren Files blockweise lesen, Basisfunktion: fread() FIXME

logging_ext: Logging-Modul - nützliche Log-Funktionen (FIXME)

trim_ext: Trim-Modul - Funktionen um die Leerzeichen vorne und hinten bei einem String wegschneiden

Array of Messages: Alle Messages, die ein Programm ausgibt, an einer Stelle zusammen halten

Zweidimensionale dynamische Arrays

Beispiel CPU-Time Funktionen

Vorlage C-Programm: Ein Gerüst für ein C-Programm

Debug-Makros - Einige nützliche Beispiele, die sich beim "Debuggen" als hilfreich erwiesen haben

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)

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

Programmbeispiele in C++:

C++ Crashkurs - Einige Beispiele / Übungen.

static_assert() (C++11)

Auf der Kommandozeile übergebene Parameter parsen

Aktuellen Timestamp erfassen

Trim

Stringutils - Helper rund um die Strings (trim, trim_left, trim_right, pad_left, pad_right, to_upper, replace, compare_nocase, split, split_lines)

Fileutils

"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 Zuweisung eines Objekts an Static Member einer Klasse! (Relevant für den GNU-Compiler)

:!: Vorsicht bei der Initialisierung eines Objekts bei dessen Deklaration! (Relevant für den GNU-Compiler)

:!: Export von Klassen/Strukturen/Methoden/Funktionen, die STL-Objekte (oder Templates allgemein) als Member/Parameter verwenden (insbesondere für DLLs relevant)

Size of 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:

…und auf http://www.programmerinterview.com/:

Die xxxxxx_s()-Funktionen nachbauen - memcpy_s(), strcpy_s(), strncpy_s()

:!: 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 Wikipedia (englisch), 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 (<assert.h>, <float.h>, <math.h>, <stdarg.h>, <stdlib.h>, <ctype.h>, <limits.h>, <setjmp.h>, <string.h>, <signal.h>, <stdio.h>, <time.h>)

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:

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://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):

Blog Modernes C++ von Rainer Grimm auf Heise: https://www.heise.de/developer/ModernesCplusplus-3691794.html

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)
Programmieren mit C++ Templates
Fehlerfreies Programmieren in C++ - Dynamische Allokation von Ressourcen

In der Klasse "std::string" fehlt die trim-Funktion. Im Thread 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 (Structured Exception Handling): https://msdn.microsoft.com/de-de/library/swezty51(v=vs.120).aspx

libstdc++ Source Documentation: https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/

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

Shared Memory

Filesystem

ADMIN-Tipp: 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)

Verschlüsselung

mit OpenSSL

mit Boost.Asio

Oliver Müller auf "Heise Developer":
SSL/TLS-Netzwerkprogrammierung mit Boost.Asio (2016)

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.)

libwww (Library World Wide Web): https://en.wikipedia.org/wiki/Libwww - modulares client-seitiges Web-API für Unix und Windows.
(Sehr veraltet, letzter Release 12.2006.)

Threads

:!: Das Abarbeiten mehrerer Threads innerhalb eines Prozesses wurde mit dem C++11-Standard eingeführt.

Client-Server mit Threads (:!: ToDo)

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:

Sonstiges

JSON-Parser: Library "jsoncpp" - https://github.com/open-source-parsers/jsoncpp


Stand: 09.04.2024

EOF

edv/prg/c.txt · Zuletzt geändert: 2024/04/09 13:28 von Jürgen Kreick

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki