home *** CD-ROM | disk | FTP | other *** search
- _______________ _____ _____ _________ ___________________
- \. /________ |. /_____:o | /. \/|___/_ \ /
- \___ _____/|. / \|| /|. |: |// ______/·|. / ______ \ ___/
- /. /_/· || / \: \|| |· |/ / \ \/ || /_______ \/+ /
- // ____/ || \ \ \ \: ¯¯¯ | / / / || \ /·\ / \ __/_
- // / // |+ \ \ \ \___/ | \___/ / |· \/ \/ / /
- /· / \\ / \ / |: | / / / /
- \___/ \________/_____|\___/: |_____|_______/\________/_______/______/
- l_____|·MBB·
-
-
- _ ___ \ _
- ___|__________/\______\//\________________________________________________ _
- \___ / ___/ \_____\//\______________ /\ ______/ _______/ ___ _
- | _/ \ _ \_ \/ | ___)_/_ ___/_/_ ___)_\______ \______
- | \ \/ / || | \ | \ | \ / / /
- _ __| \__________/____|| |____ |__ |__ _____/ ___ _
- `----' `-----' `------' `------' `---------' `------'
-
- [hOMELESS÷bBS!]
-
- [bIRDHOUSE^pROJECTS eUROPEAN hQ][mYTH! gERMAN hQ][aRT-cORE! fUN hQ]
-
- [sYSdOODE: -sLIME!^bIRDHOUSE÷pROJECTS-lEADER^mYTH!]
- [cOdOODES: mOGUe!/sCX^aC! pRIMUS!/bP!-lEADER]
- [MR.VAiN/bNZ^aC! wHIRLWIND/mYTH!]
-
- [uPLOADER:GeNeRaTioN ][oF:[+] PRODIGY '95 [+]]
- [uPLOAD tIME:13:52:59][uPLOAD dATE:03-Jan-95]
-
- _ ___ \ _
- ___|__________/\______\//\________________________________________________ _
- \___ / ___/ \_____\//\______________ /\ ______/ _______/ ___ _
- | _/ \ _ \_ \/ | ___)_/_ ___/_/_ ___)_\______ \______
- | \ \/ / || | \ | \ | \ / / /
- _ __| \__________/____|| |____ |__ |__ _____/ ___ _
- `----' `-----' `------' `------' `---------' `------'
-
-
-
-
- «------------------[ eLITE gUYS wILL gET iNVITED hERE ]------------------»
- . . . . : · .
- ____/¦__ ___/¦____ __/¦___________/¦__ ¦ ¦___/¦__ !
- _ ____ \__\____ _// _____\_________ \ | | ____ \__ _:/\__
- /· |____//· | \\_____ ·\| | | \\| |/· |____/ \ Oo /
- // | \ | \ l \\ | | ·\_ // | \ /_--_\
- \__________\________/________/___j___j / \__________\ :\/
- -------------------------------------l____/ :----------- ¡
- · ·
- . : · . . . .
- ! _ ____/¦__ ¦ ¦____¦\____ ____/¦__ ___/¦____ __/¦_____ __
- _:/\__ _ _ ____ \__| |______ \ _ ____ \__\_ | _// _____ __ _
- \ Oo / /· |____/| |/· __ __/ /· |____//· | \\_____ ·\
- /_--_\ // | \| // | \_// | \ l \ l \\
- :\/ \__________\ \____j /\__________\________/________/
- ¡ -----------· :----l____/-------------------------------
- · ·
- <*> pRODIGY gHQ <*> nEUTRON wHQ <*> iLLUSION eHQ <*> dYNAMIX gHQ <*>
-
- Upload Date: [01-03-95] «» Upload Time: [07:18:16]
-
- «-------------------[ aSK eLITE fOR SYS-PW & NUMBA ! ]-------------------»
-
- .__ _ r
- : __tHIS fILE wAS D/L fROM I
- _ _02-Jan-95_________________________: N
- _| \/ | G
- \/ T¾R¾S¾I LEADER H¾Q \\ ² tRISTAR & rED
- \ sECTOR
- ö . |_/\________/\__.___ _/\_______ | W
- /\ |\ ._ \ \ \ ____)² iNC.
- . \/\------------|/ |/____/ \ / __)__!---------------.
- |\/ / ² / | \ \ 4nODEZ |
- | \_____| \_____²_____/___________/ !_
- |ö | | /_/\
- | _/\__.___ !/\_._/\________/\________/\______! _/\______ \_\/
- | \ \ \___!\ ._ \ ._ \ ____) \ . \ |
- 00:13:09 \ / |/ |/ / |/ / __)__ / | \_/¹
- / | \ | / / / / \ | \
- \_____²_____/____²_________/_________/___________/_____²_____/ö2Fö
- ² ²
- _!/\__ |__
- \ Oo / +49 p¾R¾I¾V¾A¾T¾E¾! ___| /
- eLITE gUYS /_--_\ \ //
- wILL gET ²\/ tHE hOLY mASTER iS \/|
- iNVITED hERE ! mClOUD ²
- ² aND hIS hELPING hAND iS mARIO :
- :
- ¾ aSK fOR nUMBER aND sYSPW/nUP
-
-
- @BEGIN_FILE_ID.DIZFREQUENTLY ASKED QUESTIONS ABOUT `C`
- -German Edition-
- 4-10
- @END_FILE_ID.DIZ
- /Teil 4/
-
- 2. "Stringizing"
-
- Ein weiteres Problem der K&R-Preprozessoren waren
- Makro-Expansionen zu Strings:
-
- #define STRING(a) "a" /* K&R */
-
- char s1[] = STRING(Hallo);
-
- Die meisten K&R-Preprozessoren (aber nicht alle)
- expandieren dies zu
-
- char s1[] = "Hallo";
-
- Einige liefern
-
- char s1[] = "a";
-
- Mit einem ANSI-Preprozessor schreibt man
-
- #define STRING(a) #a /* ANSI */
- #define NOSTRING(a) "a"
-
- char s1[] = STRING(Huhu);
- char s2[] = NOSTRING(Hallo);
-
- Dies wird zu
-
- char s1[] = "Huhu";
- char s2[] = "a";
-
- 3. "Charizing"
-
- Ähnlich wie bei "Stringizing" ersetzten einige K&R-
- Preprozessoren Argumente innerhalb von Zeichen-
- konstanten:
-
- #define CHAR(a) 'a' /* K&R */
- Preprozessor 19
- ---------------------------------------------------------------
-
-
- char c1 = CHAR(x);
-
- Dies wird von einigen K&R-Preprozessoren zu
-
- char c1 = 'x';
-
- expandiert. Es gibt keine direkte Entsprechung für
- diesen Mechanismus (er ist auch ziemlich unsinnig) in
- ANSI. Obiges würde man in ANSI C wie folgt schreiben
- (oder es direkt lassen):
-
- #define CHAR(a) a /* ANSI */
-
- char c2 = CHAR('x');
-
- 4. Null-Operation
-
- Ein ANSI Preprozessor kennt eine leere Operation: Ein
- einzelnes '#' in einer Zeile.
-
- 5. "Rescanning"
-
- Ein ANSI-Preprozessor arbeitet prinzipiell anders als
- ein K&R-Preprozessor. Wird ein Makro irgendwo verwendet,
- werden zuerst ev. vorhandene Aktual-Parameter expan-
- diert, dann werden sie eingesetzt. Das Ergebnis dieses
- Ersatzes wird wieder auf gültige Makros untersucht (das
- sog. Rescanning). Entsprechende Makros werden weiter
- ersetzt. Ausgenommen davon ist der ursprüngliche Name
- des zu ersetzenden Makros; damit wird jegliche Art von
- von Rekursion vermieden.
-
- Ein K&R-Preprozessor geht hier wesentlich einfacher vor
- (1:1 Textersatz) und fällt z.B. bei folgendem auf die
- Nase:
-
- #define MACRO(x) MACRO(x) /* K&R */
-
- MACRO(1); /* Bummmmm... */
-
- Ein ANSI-Preprozessor hingegen liefert:
-
- #define MACRO(x) MACRO(x) /* ANSI */
-
- MACRO(1); /* wird zu "MACRO(1);" */
-
- 6. #pragma
-
- Das '#pragma'-Direktiv gibt es nur in ANSI C. Es dient
- zur (nicht portablen) Einstellung von Compileroptionen
- u.ä. Da das Verhalten eines Compilers bei '#pragma'
- völlig im Belieben des Compilerbauers liegt, starteten
- erste Versionen des GNU-Compiler beim Auffinden von
- '#pragma' das Spiel Nethack...
- 20 Preprozessor
- ---------------------------------------------------------------
-
-
- 7. #error
-
- Auch das '#error' Kommando findet sich nur bei ANSI-
- Preprozessoren. Es beendet den Compilerlauf und gibt
- eine Meldung aus.
-
- 8. defined()
-
- Der 'defined()'-Operator (und einige andere Operationen)
- gibt es wohldefiniert nur in ANSI C. Allerdings
- unterstützen auch viele K&R-Preprozessoren diese
- Operationen.
-
- 9. "Source file inclusion"
-
- Ein ANSI-Preprozessor erlaubt folgendes:
-
- #define FILENAME <incl.h>
-
- #include FILENAME
-
- (Achtung: Viele sog. ANSI-Preprozessoren fallen dabei
- trotzdem auf die Nase...)
-
- 10. __LINE__, __FILE__, __DATE__, __TIME__, __STDC__
-
- Ein ANSI-Preprozessor besitzt obige vordefinierte
- Makros. Besonders __STDC__ ist interessant, da das
- Vorhandensein von __STDC__ bedeutet, daß es sich um
- ANSI C handelt:
-
- #ifdef __STDC__
- #define STRING(a) #a
- #else
- #define STRING(a) "a"
- #endif
-
- 11. "Trigraphs"
-
- Trigraphs sind eine ganz ekelhafte Sache in ANSI C. Es
- sind Drei-Zeichen-Ersatzdarstellungen für 'Sonder-
- zeichen', von denen das ANSI-Komitee glaubte, daß man
- sie nicht in jedem (gängigen) Zeichensatz findet. Tri-
- graphs werden noch vor jeglicher Preprozessor-Aktion wie
- folgt ersetzt:
-
- ??= -> #
- ??( -> [
- ??/ -> \
- ??) -> ]
- ??' -> ^
- ??< -> {
- ??! -> |
- ??> -> }
- ??- -> ~
- Preprozessor 21
- ---------------------------------------------------------------
-
-
- Mit Trigraphs geschriebener Sourcecode sieht grausam aus
- (von C ist nichts mehr zu erkennen). Daher kann man von
- der Verwendung von Trigraphs nur abraten!
-
- ??=include <stdio.h>
-
- int main(void) ??<
- char text??(??) = "Ein Text??/n";
- char *p = text;
-
- while(*p) ??<
- putchar(*p++);
- ??>
-
- return 0;
- ??>
-
- 12. Makro-Argumente
-
- Ein ANSI-Preprozessor legt Wert darauf, daß bei Verwen-
- dung eines Makros genau so viele Argumente übergeben
- werden, wie in der Makrodefinition angegeben. Ein K&R-
- Preprozessor überprüft das nicht:
-
- /* K&R */
- #define ERROR(x) fprintf(stderr, x)
-
- /* legal in K&R */
- ERROR("No file %s\n", fn);
-
- Bei obigem Aufruf von ERROR() würde ein ANSI-Prepro-
- zessor meckern. Im Prinzip ist die Überprüfung der
- Anzahl der Parameter eine sinnvolle Sache; der Fluch der
- bösen ANSI-Tat ist jedoch, daß sich für obiges Makro
- kein ANSI-Equivalent angeben läßt. Man muß wirklich eine
- Funktion mit variabler Anzahl von Argumenten schreiben
- (siehe Q4.1). Um diesen Nachteil zu überwinden, besitzen
- einige ANSI-Preprozessoren nichtstandardisierte Erweite-
- rungen:
-
- So gibt es einige Preprozessoren, die - wenn die
- Argumente mit '((...))' statt '(..)' geklammert werden -
- keine Überprüfung der Argumentanzahl durchführen. Das
- zusätzliche Klammerpaar wird bei diesen Preprozessoren
- nicht in den expandierten Text eingesetzt.
-
- /* unstandardisierte Erweiterung */
- #define ERROR(x) fprintf(stderr, x)
-
- /* zusaetzliche Klammern! */
- ERROR(("No file %s\n", fn));
-
- Ein echter ANSI-Preprozessor würde bei obigen Aufruf von
- ERROR() zwar auch nur ein Argument zählen, allerdings
- gehört das zusätzliche Klammerpaar zum Argument und
- würde mit in den expandierten Text eingesetzt.
- 22 Preprozessor
- ---------------------------------------------------------------
-
-
- Der weit verbreitete GNU C-Compiler verwendet hingegen
- eine Erweiterung ähnlich den drei Punkten bei der
- Programmierung von Funktionen mit variabler Anzahl von
- Argumenten:
-
- /* GNU Preprozessor */
- #define ERROR(f, a...) fprintf(stderr, f, ## a)
-
- /* Aufruf wie eine normale "stdargs"-Funktion */
- ERROR("No file %s\n", fn);
-
- Eine Syntax, die von einem echten ANSI-Preprozessor
- nicht verstanden würde. (tw)
-
-
- Q2.2 Was soll die "übertriebene" Klammerung bei Makro-
- Definitionen?
-
-
- Sie ist nicht übertrieben. Angenommen, ein Makro wird statt
-
- #define SUM1(a, b) ((a) + (b))
-
- als
-
- #define SUM2(a, b) a + b
-
- definiert. Wenn dann letzteres z.B. wie folgt verwendet wird
-
- SUM2(2, 3) * 4
-
- expandiert der Preprozessor das zu
-
- 2 + 3 * 4
-
- Das Ergebnis ist 24, erwarten würde man allerdings 20. Daher im
- ersten Makro die äußeren Klammern.
-
- Auch die Klammern um die Argumente a und b sind aus ähnlichen
- Gründen sinnvoll. Wenn diese Klammern nicht da wären und man
- setzt z.B. für a '3' und für b '1 << 4' ein, würde man
-
- 3 + 1 << 4
-
- erhalten. '+' besitzt einen größeren Vorrang als '<<', also
- wird der Ausdruck als
-
- (3 + 1) << 4
-
- ausgewertet (Ergebnis 64). Mit den Klammern um a und b im Makro
- erhält man wie erwartet
-
- (3) + (1 << 4)
-
- Das Ergebnis ist 19.
-
- Guter Programmierstil zeichnet sich u.a. dadurch aus, daß man
- alle Makros sauber und bis zum Exzeß klammert. (tw)
- Deklarationen, Definitionen, Prototypen 23
- ---------------------------------------------------------------
-
-
- Kapitel 3
-
- Deklarationen, Definitionen, Prototypen
-
-
- Q3.1 Was ist der Unterschied zwischen "Definition" und
- "Deklaration"?
-
-
- Bei der Definition wird ein Objekt erzeugt, d.h. Name,
- Datentyp, Speicherklasse und Sichtbarkeit werden festgelegt, es
- wird Speicher zugewiesen, und das neue Objekt wird möglicher-
- weise initialisiert.
-
- Beispiele:
-
- int i;
- const int Escape = 0x1b;
- FILE *fp;
- double (*eval)(const char *expr);
- const volatile unsigned long *const sys_timer =
- (const volatile unsigned long*)0xabcd0;
- char message[] = "press any key";
- double square(double x) { return x*x; }
-
- Eine Deklaration ist prinzipiell dasselbe, d.h. sie macht einen
- Namen mit seinem Datentyp bekannt, nur daß kein Speicherplatz
- zugewiesen wird und auch keine Initialisierung möglich ist.
- Während eine Definition also sagt "Erzeuge das Objekt sowieso",
- sagt eine Deklaration "Es gibt irgendwo ein Objekt sowieso". Wo
- das Objekt definiert wird, ist dabei egal - es kann eine Zeile
- danach definiert werden, oder eine Zeile davor, oder irgendwo
- in demselben oder in einem anderen Modul. Wenn das Objekt nicht
- benutzt wird, kann man es auch deklarieren, ohne daß es
- irgendwo definiert wird. Eine Deklaration ist also nur eine
- Information für den Compiler, aber nichts, was "codeerzeugend"
- wirkt. Um von einer Definition unterschieden werden zu können,
- werden Deklarationen mit 'extern' markiert. Nur bei Funktions-
- deklarationen, auf die keine Funktionsdefinition folgt, kann
- das 'extern' entfallen.
-
- Beispiele:
-
- extern int errno;
- extern const char *message;
- extern char *strcpy(char *dest, const char *src);
- void f(int);
- 24 Deklarationen, Definitionen, Prototypen
- ---------------------------------------------------------------
-
-
- Objekte können beliebig oft deklariert werden, solange sich die
- Deklaration nicht ändert:
-
- /* erlaubt */
- extern int errno;
- extern int errno;
-
- /* erlaubt */
- extern void f(int i);
- extern void f(int j);
-
- /* nicht erlaubt */
- extern int i;
- extern long i;
-
- /* nicht erlaubt */
- extern char *message;
- extern char message[];
-
- Jedes Objekt, auf das ein Programm zugreift, muß vorher dekla-
- riert worden sein. Die einzige Ausnahme sind Funktionen; wenn
- eine Funktion aufgerufen wird, ohne daß sie vorher deklariert
- wurde, nimmt der Compiler automatisch die Deklaration
-
- extern int fct();
-
- an (d.h. er geht davon aus, daß die Funktion ein int zurückgibt
- und daß sie eine feste, aber unbekannte Argumentenliste hat).
-
- Eine Definition enthält immer auch eine Deklaration, weswegen
- in dem (Normal-) Fall, daß ein Objekt vor seiner ersten Verwen-
- dung definiert wird, keine separate Deklaration notwendig
- ist. (wr)
-
- /Ende von Teil 4/
-
- Keep hacking
- Wolfram
-
-
-
-
- «------------------[ eLITE gUYS wILL gET iNVITED hERE ]------------------»
- . . . . : · .
- ____/¦__ ___/¦____ __/¦___________/¦__ ¦ ¦___/¦__ !
- _ ____ \__\____ _// _____\_________ \ | | ____ \__ _:/\__
- /· |____//· | \\_____ ·\| | | \\| |/· |____/ \ Oo /
- // | \ | \ l \\ | | ·\_ // | \ /_--_\
- \__________\________/________/___j___j / \__________\ :\/
- -------------------------------------l____/ :----------- ¡
- · ·
- . : · . . . .
- ! _ ____/¦__ ¦ ¦____¦\____ ____/¦__ ___/¦____ __/¦_____ __
- _:/\__ _ _ ____ \__| |______ \ _ ____ \__\_ | _// _____ __ _
- \ Oo / /· |____/| |/· __ __/ /· |____//· | \\_____ ·\
- /_--_\ // | \| // | \_// | \ l \ l \\
- :\/ \__________\ \____j /\__________\________/________/
- ¡ -----------· :----l____/-------------------------------
- · ·
- <*> pRODIGY gHQ <*> nEUTRON wHQ <*> iLLUSION eHQ <*> dYNAMIX gHQ <*>
-
- Upload Date: [01-03-95] «» Upload Time: [07:18:16]
-
- «-------------------[ aSK eLITE fOR SYS-PW & NUMBA ! ]-------------------»
-
- [-AquaAdder v1.0-]
-
-
-
-
-
-
- -sLiME!^bP·LEADER^mTH!
- mOGUe!^aC! pRIMUS!/bP·lEADER
- wHIRLWIND/mTH! MR.VAIN/BNZ^sXi^aC!
-
- -- --- ---- pHUKKIN' fAST aMIGA ^ wORLD'S lARGEST cHIPTUNE aREA ---- --- --
- ____
- ___| |_____________ __________________ ____________________________
- _/ _| | ._________\/__________ \ _/___\______ \ _____/ _____/
- \ \. | l/ / \/ | _____/_ l / _____/\____ _/\____ \_
- \___| |________/____||-Mo!|________________/_______\ _______\ ________/
- l____| l____| \/ \/
-
- -- --- ---- aMI-eX fREE-lEECH ^ bIG aSCII bASE © bY aC! ---- --- --
-
- -- mYTH! gHQ - -÷- - bIRDHOUSE pROJECTS! eHQ - -÷- - aRT-cORE! eHQ --
-
- _______________ _____ _____ _________ ___________________
- \. /________ |. /_____:o | /. \/|___/_ \ /
- \___ _____/|. / \|| /|. |: |// ______/·|. / ______ \ ___/
- /. /_/· || / \: \|| |· |/ / \ \/ || /_______ \/+ /
- // ____/ || \ \ \ \: ¯¯¯ | / / / || \ /·\ / \ __/_
- // / // |+ \ \ \ \___/ | \___/ / |· \/ \/ / /
- /· / \\ / \ / |: | / / / /
- \___/ \________/_____|\___/: |_____|_______/\________/_______/______/
- l_____|·MBB·
-
-