Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » define unfein?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.09.2007, 23:21 Uhr
~banshee1337
Gast


hallo,

define ist schlecht heißt es ja fast überall :>

Ich hab mir aber schon einige Open-Source-Projekte von sourceforge.net angeschaut und so gut wie in jedem wurden define Makros benutzt, für so Sachen wie zb.:


C++:
#define initlog(s) puts("init: " s)
    initlog("sdl");


Kann man sowas in define-freien effizienteren Code umwandeln oder ist hier define doch die bessere Alternative?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.09.2007, 23:30 Uhr
0xdeadbeef
Gott
(Operator)


Du könntest einfach puts("init: sdl"); schreiben.

Generell sind Makros aber nur in C++ wirklich teuflisch, in C haben sie gelegentlich Anwendungsgebiete. Das Beispiel da ist gerade etwas schlecht, weils nur mit String-Konstanten arbeiten kann, aber in einer altertümlichen Sprache muss man manchmal auch auf altertümliche Mittel zurückgreifen
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.09.2007, 09:49 Uhr
stephanw
localhorst


Und auch in C++ muss man sie nicht verteufeln, aber mit Bedacht und sehr sparsam verwenden.

Dein obiges Beispiel ist unglücklich. Ebenso ist ein

C++:
#define MY_SIZE 65
sinnfrei, da geht auch ein
C++:
const int MY_SIZE = 65;
und sollte vorgezogen werden.

Aber gerade bei Log-Meldungen kann es wiederum sinnvoll sein. Der C/C++ Preprozessor hat definiert die Macros __FILE__ und __LINE__. File ist eine Zeichenkette des aktuellen Dateinamens und Line die Zeilennummer.

Wenn man jetzt einen Fehler ins Logfile schreiben will, könnte man

C++:
void logError(const char* msg, const char* fileName, int line);

if (p == 0)
  logError("Pointer is invalid", __FILE__, __LINE__);



schreiben. Da finde ich es nicht blöd, das zu vereinfachen:

C++:
#define LOGERROR(msg) logError(msg,__FILE__,__LINE__)

LOGERROR("Pointer is invalid");


--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.09.2007, 10:50 Uhr
Kest
saint


Hi!

Auch in dem Falle ließe sich so was machen:

C++:
inline void logError(const char* msg, const char* fileName=__FILE__, int line=__LINE__);

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.09.2007, 16:15 Uhr
0xdeadbeef
Gott
(Operator)


...damit kriegst du aber immer die Header-Datei und die Zeile, in der die Deklaration in der Header-Datei steht, was in aller Regel nicht besonders nützlich ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.09.2007, 19:01 Uhr
Kest
saint


Sollte das nicht >Definition< heißen?
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.09.2007, 22:04 Uhr
0xdeadbeef
Gott
(Operator)


Nein, das ist eine Deklaration. Die Definition ist das, wo nachher der eigentliche Quellcode steht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.09.2007, 22:56 Uhr
Kest
saint


Ich hab gemeint: >...damit kriegst du aber immer die Header-Datei und die Zeile, in der die Deklaration Definition in der Header-Datei steht, was in aller Regel nicht besonders nützlich ist.<
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.09.2007, 23:02 Uhr
0xdeadbeef
Gott
(Operator)


Das war mir schon klar. Und es ist nach wie vor eine Deklaration. Die Definition ist das, wo nachher der Quellcode steht.

Davon ab, selbst wenn du's in die Definition schreibst, was im Fall einer inline-Funktion sogar möglich ist, hilft dir das nicht weiter. __FILE__ und __LINE__ sind Makros, keine Variablen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.09.2007, 23:20 Uhr
Kest
saint



Zitat von 0xdeadbeef:
Das war mir schon klar. Und es ist nach wie vor eine Deklaration. Die Definition ist das, wo nachher der Quellcode steht.

Das war mit scon immer klar. Und dass >inline void logError(const char* msg, const char* fileName=__FILE__, int line=__LINE__);< eine Deklaration ist, weiß ich. Ich war einfach der Meinung, dass man mit >__FILE__< den Namen der Datei bekommt, in der die Funktion letzten Endes definiert wurde. Aber danke, dass du mir klar gemacht hast, dass ich unrecht hatte.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 21.09.2007 um 23:21 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: