Preprocessor Problem

kickerxy123

Erfahrenes Mitglied
Hallo zusammen,

ich habe folgendes Problem:

- was ich ereichen will:
C++:
int test()
{
int *a = mynew int[40]; //ok das habe ich hinbekommen, kein compilerfehler
mydelete a;  //kein syntaxfehler, ich möchte hier keine klammern, aber kompiliert noch nicht
}

Konkret habe ich new/delete partiell global overloaded (nicht replaced); partiell meint hier -> überschreibt die Operatoren nur in meinen Codes, nicht in der STL etc.

Ich versuche mydelete als Macro zu realisieren und denke, dass es gehen muss.
C++:
void mydeleteInternal(void* ptr, const char* filename, int line);
#define mydelete(X) mydeleteInternal(X, __FILE__, __LINE__)
damit funktioniert das hier:
C++:
mydelete(a); //ok
Was notfalls auch geht, aber aus syntaktischen Gründen wäre mir ein mydelete a; deutlich lieber.

Ich brauche also ein Weg die Klammern beim Makroaufruf weglassen zu können.

ich habe dafür ein Beispiel gefunden:
C++:
namespace __hidden__
{
  struct print
   {
     print(){}
     ~print(){}
 
     template<typename T> print &operator , (const T &t){ std::cout << t ; return *this; }
   };
}

#define printE __hidden__::print(),
#define printF printE __FILE__ , __LINE__ ,

int main(int argc, char** argv)
{
   printF "hallo", 0, 1, 2, 3, 4; //funktioniert ! Ergebnis auf console "main20hallo01234"
return 0;
}

Jemand eine Idee, wie ich das jetzt konkret verbinden kann um mein Ziel zu erreichen? Wie ihr seht, habe ich __FILE__ und __LINE__ automatisch an printF rangehängt.

Wo ist also das Problem?
Da das Beispiel den "," Operator überlädt werden die Funktionsparameter nacheinander, einzelnd, aufgerufen und ausgeführt. Das ist in meinem Fall natürlich nicht sinnvoll.

Hoffe ihr könnt mir weiterhelfen, meine Präprozessor Kenntnisse sind auch nicht die besten, da ich normalerweise alles dafür tue, um C++11 Alternativen zu finden.


Viele Grüße und danke
kickerxy123

#edit: ich kann nicht einfach delete overloaden, da es dann global für alles gelten würde...



#edit2: ok, habe eine Lösung realisiert mit dem "," Operator. Da wird bei jedem Aufruf der "," Funktio gecheckt, welcher Parameter an der Reihe ist und in ein struct an der richtigen Stelle geschrieben.
Im Destruktor wird dann das struct evaluiert.

Funktioniert! Aber mir gefällt das noch nicht ganz, da dadurch 3 Funktionsaufrufe stattfinden. Wenn jemand noch ein Tipp hat, wäre ich dankbar
 
Zuletzt bearbeitet:
Zurück