Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

1

16.02.2008, 18:19

#define WriteToLog(x,...) fehler

#define AUOWriteToLog(x,...) {g_pAUOLog->WriteToLog(x,...);}

Ich wollte frage wie man mit #define eine Argumentenliste definiert.
Bei den Funktion funktioniert dies ja ganz einfach mit:"void Function(char* text, ...);".
Aber bei #define funktioniert es nicht.
Dort erkennt der Compiler dann die "..." Punkte als Syntaxfehler.

Weiß jemand wie man das dort definiert. Wäre für Hilfe sehr dankbar :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

16.02.2008, 18:40

Der Syntaxfehler rührt daher, dass das was du tun willst nicht funktioniert. Es gibt Präprozessor-Metaprogrammierung, was ein "workaround" für dein Problem sein könnte, aber ich kann dir davon nur abraten. Das macht den Quellcode extrem unüberschaubar. Sollte es dich doch interessieren: http://www.boost.org/libs/preprocessor/doc/index.html
@D13_Dreinig

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

3

16.02.2008, 19:15

Okey danke ;)
Ich werde versuchen das Problem anders anzugehen

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

16.02.2008, 19:26

Geht es um etwas wie sprintf? Also sprich dass du eine beliebig lange Argumenten Liste haben kannst? Wenn ja, gibt es dazu sicher einige Infos im Inet, aber sicherer/einfacher dürfte std::stringstream sein bzw. einfach std::string.
Oder was willst du machen?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

16.02.2008, 22:40

So wie ich das verstanden habe will er eine Ellipsis für Macros verwenden.
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

6

17.02.2008, 13:49

Re: #define WriteToLog(x,...) fehler

Zitat von »"Ashnarott"«

#define AUOWriteToLog(x,...) {g_pAUOLog->WriteToLog(x,...);}

im konkreten Fall könntest du auch einfach schreiben

C-/C++-Quelltext

1
#define AUOWriteToLog g_pAUOLog->WriteToLog


Kleine Anmerkung zu deinem Macro, wenn ... funktionieren würde: durch die Einbettung in Klammern {} ist das Teil nicht mehr im selben Umfang einsetzbar wie es die eigentliche Schreibweise g_pAUOLog->WriteToLog(x,...) wäre. Z.b. innerhalb von if Bedingungen oder auch nur zum Speichern eines Rückgabewertes (falls es einen gibt bei der Funktion)

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

7

17.02.2008, 17:58

Okay vielen Dank für die viele nützlichen Antworten :)

Ich wollte einfach nur ein Makro definieren damit man nicht dauernd g_pLog->WriteToLog(x, ...); schreiben muss sondern WriteToLog(x, ...).

Aber es funktioniert jetzt, wenn ich es so mache wie es grek40 beschrieben hat. Vielen dank :) Bin gar nicht darauf gekommen es so zu definieren.
Ich hatte es nur so aus einen Buch entnommen also diese schreibform:
#define AUOWriteToLog(x,...) {g_pAUOLog->WriteToLog(x,...);}
Aber warum einfach wenns auch kompliziert geht :D

Also danke an ALLE das Problem ist behoben ;)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

8

17.02.2008, 18:00

Überlade doch einfach den ()-Operator

9

17.02.2008, 19:05

Rofl, wieso n Macro, wenn es eine inline Funktion auch tun würde?

C-/C++-Quelltext

1
2
3
4
inline WrtieToLog(blub)
{
   log->Writetolog(blub);
}


Makros geben oft hässliche Fehlermeldungen, deshalb sollte man sie vermeiden, wenn man dadurch keinen Nachteil hat.
Lieber dumm fragen, als dumm bleiben!

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

17.02.2008, 20:22

Bin grad am überlegen, ob das wirklich gehen würde, oder ob damit die Art, wie die Parameterauswertung erfolgt den Bach runter gehen würde, da die ganzen angehängten Parameter ja schon in WrtieToLog (nette Schreibweise) landen würden.

Werbeanzeige