====== C ======
===== Bücher =====
empfehlenswerte C/C++ - Bücher:
* [[http://www.onlinetutorials.de/cpp/einfuhrung-in-iso-cpp-pdf/|Einführung in ISO C++]] {{:einfuehrung-iso-cpp-holger-jakobs.pdf|(PDF)}}
* ISBN-10: 3833422165 (C++ Programmierung für Anfänger)
* ISBN-13: 978-3898642217 (C++ Programmieren mit Stil) In diesem Buch findet der Leser einen kompakten und umfassenden Überblick zum ANSI C++ Standard.
* ISBN-13: 978-3827328236 (Die C++-Programmiersprache: Deutsche Übersetzung der Special Edition)
===== Beispielschnipsel =====
==== STDIN ====
=== stdin2syslogd ===
#include
#define SYSLOG_NAMES
#include
#include
#include
int main(int argc, const char *argv[])
{
if (3 != argc)
{
fprintf(stderr, "Usage: stdin2syslogd priority syslog-tag\n");
exit (1);
}
const char *priority_name = argv[1];
const char *tag_name = argv[2];
int priority = -1;
int i;
for (i = 0; prioritynames[i].c_name; ++i)
{
if (! strcmp(prioritynames[i].c_name, priority_name))
{
priority = prioritynames[i].c_val;
break;
}
}
if (priority < 0)
{
fprintf(stderr, "stdin-syslogd: priority \"%s\" not recognized",
priority_name);
exit (1);
}
// Log-Level wurde hier mit "LOCAL7" festgelegt:
openlog(tag_name, LOG_PID|LOG_NDELAY, LOG_LOCAL7);
// max. Zeilenlänge wurde hier mit 64kB festgelegt:
char buffer[65536];
while (NULL != fgets(buffer, sizeof(buffer), stdin))
{
syslog(priority, "%s", buffer);
}
return 0;
}
# gcc -o /usr/local/bin/stdin2syslogd stdin2syslogd.c
# tail -f /var/log/messages | fgrep Test_Tag
# echo "Das ist ein Logger-Test!" | /usr/local/bin/stdin2syslogd notice Test_Tag
==== Fehlercodes ====
Jeder bei Systemaufrufen vorkommende Fehler hat deshalb eine Nummer,
einen //mnemonischen Code//, und normalerweise einen //String// mit einer Meldung.
Man kann dies alles benutzen, durch Einfügen von
#include
ins Programm.
Dies bewirkt bei korrekten //Include//-Dateien auch, dass die Variablen
extern int errno;
extern char *sys_errlist[];
extern int sys_nerr;
bekannt sind. Die Fehlervariable //errno// wird vom Systemaufruf gesetzt,
wenn ein Fehler auftritt.
siehe: [[http://wwwsys.informatik.fh-wiesbaden.de/sysprog/buch0057.htm]]
==== Größe der C-Variablen anzeigen ====
Frage:
* Wovon ist das abhängig, ob int = long ist?
(eine) Antwort:
* Das ist wahrscheinlich vom Compiler abhängig. Die Plattform, die auf jeden Fall einen Compiler in long mit 64 bit hat, ist die DEC Alpha. Auf Sparc und auch x86 ist "long" 32 bit und erst
"long long" ist 64 bit lang. Der ANSI-C Standard gibt für long "mindestens 32 bit" vor. In Java ist das besser gelöst, da ist auf ALLEN Plattformen "byte = 8 Bit", "short = 16 Bit", "int = 32 Bit" und "long = 64 Bit".
=== systemtest.c ===
Mit diesem kleinen Programm kann jeder seine Plattform selber kontrollieren.
#include
int main()
{
printf("char belegt %d Bytes\n", sizeof(char));
printf("int belegt %d Bytes\n", sizeof(int));
printf("short belegt %d Bytes\n", sizeof(short));
printf("long belegt %d Bytes\n", sizeof(long));
printf("unsigned char belegt %d Bytes\n", sizeof(unsigned char));
printf("unsigned int belegt %d Bytes\n", sizeof(unsigned int));
printf("unsigned short belegt %d Bytes\n", sizeof(unsigned short));
printf("unsigned long belegt %d Bytes\n", sizeof(unsigned long));
printf("float belegt %d Bytes\n", sizeof(float));
printf("double belegt %d Bytes\n", sizeof(double));
return 0;
}
siehe: [[http://www.bsdforen.de/showthread.php?t=4894&goto=nextoldest]]