Fragen zu C
lima-city → Forum → Programmiersprachen → C/C++ und D
anweisung
code
datei
deklaration
frage
funktion
header
http
krieg
machen
methode
nachteil
operation
operator
paar
prototyp
referenz
standard
verschieben
zahl
-
Hallo miteinander,
ich hab nochmal paar Fragen bzgl. C, ich hoffe ihr könnt mir helfen.
1) Zum Präprozessor: Was macht eigentlich die #include-Anweisung wenn eine Datei vorher schon mal included wurde?
Also:
main.c:
#include a.h
#include b.h
a.h:
#include b.h
wird b.h in main.c nochmal reinkopiert oder merkt der Präprozessor das?
2) Wie krieg ich eigentlich einen *normalen* Right-Shift hin? Also zB aus 10.10.01.00 rightshift 2 = 00.10.10.01
3) "static" vor Funktionen: In meiner Referenz steht, dass static int f() bedeutet, dass f() nur innerhalb der Datei aufrufbar ist. Aber wofür braucht man das? Man könnte doch einfach den Prototyp aus der Header-Datei nehmen.
4) wie kann ich herausfinden ob eine Fließkomma-Variable den Wert "Keine Zahl" enthält? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo miteinander,
ich hab nochmal paar Fragen bzgl. C, ich hoffe ihr könnt mir helfen.
1) Zum Präprozessor: Was macht eigentlich die #include-Anweisung wenn eine Datei vorher schon mal included wurde?
Also:
main.c:
#include a.h
#include b.h
a.h:
#include b.h
wird b.h in main.c nochmal reinkopiert oder merkt der Präprozessor das?
Soweit mir bekannt ist, betreibt der Präprozessor reine Textverarbeitung. #include kopiert daher einfach die angegebene Datei in den Quelltext. Um schonmal eingefügte Dateien zu überspringen definiert man daher üblicherweise irgendeine aussagekräftige Konstante und fragt die dann bspw. mit #ifdef ab.
2) Wie krieg ich eigentlich einen *normalen* Right-Shift hin? Also zB aus 10.10.01.00 rightshift 2 = 00.10.10.01
Was verstehst du unter normal? Es gibt arithmetische und logische Rechtsshift-Operationen. In C ist das anscheinend (c-typisch) absurd gelöst:
The (1999) ISO standard for the C programming language defines the C language's right shift operator in terms of divisions by powers of 2. Because of the aforementioned non-equivalence, the standard explicitly excludes from that definition the right shifts of signed numbers that have negative values. It doesn't specify the behaviour of the right shift operator in such circumstances, but instead requires each individual C compiler to specify the behaviour of shifting negative values right.
http://en.wikipedia.org/wiki/Arithmetic_shift
oder kürzer:
C, however, has only one right shift operator, >>. Many C compilers choose which right shift to perform depending on what type of integer is being shifted; often signed integers are shifted using the arithmetic shift, and unsigned integers are shifted using the logical shift.
http://en.wikipedia.org/wiki/Logical_shift
3) "static" vor Funktionen: In meiner Referenz steht, dass static int f() bedeutet, dass f() nur innerhalb der Datei aufrufbar ist. Aber wofür braucht man das?
Als Ersatz für Namensräume?
Man könnte doch einfach den Prototyp aus der Header-Datei nehmen.
Versteh ich nicht.
4) wie kann ich herausfinden ob eine Fließkomma-Variable den Wert "Keine Zahl" enthält?
Es gibt da das lustige isnan()-Macro:
http://www.opengroup.org/onlinepubs/009695399/functions/isnan.html
Beitrag geändert: 18.11.2008 23:37:07 von alopex -
hi,
kann ich alopex nur beipflichten...
@1:
includes macht man dann im Normalfall in etwa so...
======================================
#ifndef TESTFILE_INCLUDED
#define TESTFILE_INCLUDED
...
...//Declarations
...
#endif
======================================
Nachdem dass header file dann einmal eingebunden is, ist auch das TESTFILE_INCLUDED definiert und damit wird das folgende dann kein 2.Mal mehr included.
@3: static für Funktionen... Bezieht sich auf den Scope, kann man also als "Namespaces" verwenden. Soweit ich mich erinnere (bitte korrigiert mich falls ich falsch liege - is schon länger her) gibt es in C die namespaces nicht in der Art (kam erst später in C++). Um aber trotzdem die Möglichkeit zu haben, einen bestimmten Scope zu definieren, kann man static verwenden um nicht mit anderen Funktionen "außerhalb" zu kollidieren.
Das mit dem Prototyp aus der Headerdatei... interpretiere ich mal so, als dass du einfach die Deklaration von der Header-Datei in das *.c verschieben willst. Außer das es unsauber und unüberschaubar is, hat es noch den Nachteil, dass du ja die Methode trotzdem implementierst und sie somit verfügbar ist.
Greetz,
J.
-
Was verstehst du unter normal? Es gibt arithmetische und logische Rechtsshift-Operationen. In C ist das anscheinend (c-typisch) absurd gelöst:
Wieder was gelernt, den arithmetischen RS kannte ich bis jetzt gar nicht.
Ich war grade dabei zur Übung dieses Problem http://www.lima-city.de/boards/thread/81018 lösen:
und hab mich natürlich sehr gewundert, warum dieser Code nur mit ASCII-Dateien aber nicht mit Binärdateien funktioniert. Aber jetzt ist alles klar, bei einer ASCII-Datei haben die einzelnen Bytes eine Null im höchsten Bit.for(i=0; i<8; i++){ if( ((ch >> i) % 2) == 1){ putchar('1');}else{ putchar('0');} }
Das mit dem Prototyp aus der Headerdatei... interpretiere ich mal so, als dass du einfach die Deklaration von der Header-Datei in das *.c verschieben willst. Außer das es unsauber und unüberschaubar is, hat es noch den Nachteil, dass du ja die Methode trotzdem implementierst und sie somit verfügbar ist.
ok, ja das hatte ich so vor.Nachdem dass header file dann einmal eingebunden is, ist auch das TESTFILE_INCLUDED definiert und damit wird das folgende dann kein 2.Mal mehr included.
ok, nur noch eine Frage: ist es mit den Header-Dateien, die mit < > included werden, genauso?Es gibt da das lustige isnan()-Macro:
http://www.opengroup.org/onlin(...)009695399/functions/isnan.html
das nächste mal benutze ich erstmal Google, versprochen!!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage