Problem mit Makros
-
Hallo zusammen,
ich habe ein merkwürdiges Problem, dem ich momentan nicht so ganz beikommen kann.
Ich programmiere gerade ein kleines Test-System für C++-Klassen, bei dem ich die Testfunktionen (den Quelltext) durch Makros automatisch erzeugen möchte (zumindest die Rümpfe).
Ich übergebe einem Makro also den zu erzeugenden Funktionsnamen als Parameter (funktioniert einwandfrei) und möchte den Funktionsnamen dann noch als string in einer lokalen Variablen halten, damit mir Exceptions aus dem automatisierten Test noch den Namen der Funktion liefern können, aus denen sie geworfen werden.Das Makro, das die Testfunktion eröffnet, sieht folgendermaßen aus:
#define TEST_FUNC_BEGIN(FUNC) \
_testframe::TestCase::TestResult FUNC(_testframe::TestCase &aTestCase) \
{ \
static const string _theTestFuncName = string(FUNC);Dadurch wird eine Funktion FUNC angelegt, die als allererstes eine string-Variable bekommt, in der der Name der Funktion (FUNC) abgelegt wird. (Wunschdenken!)
Nun meckert der Compiler beim std::string-Konstruktor leider rum, dass er aus einer Funktion kein string-Objekt erzeugen könne. Hier der Originaltext der Fehlermeldung (man sieht, es ist MS Visual Studio 2008):
c:\users\thomas\documents\visual studio 2008\projects\myworld\myworld\testobject.cpp(7) : error C2440: '<function-style-cast>': '_testframe::TestCase::TestResult (__cdecl *)(_testframe::TestCase &)' kann nicht in 'std::string' konvertiert werden
Nach meinem Verständnis würde ich erwarten, dass einfach eine textuelle Ersetzung des Parameters FUNC stattfinden würde, d.h. dass ich mit diesem Text sowohl die Funktion anlegen und der Variablen den selben Wert verpassen kann. Dass der Compiler nach der (Funktions-)Deklaration aber glaubt, bei FUNC (oder dessen Inhalt) handelte es sich nicht um Text, sondern um eine Funktion, mir der er (logischerweise) keinen string initialisieren kann, kann ich überhaupt nicht mehr nachvollziehen.
Hat irgend jemand eine brauchbare Idee???
Übrigens: ohne diese Variable (die ich nunmal patout haben will) funktioniert das ganze System vollkommen problemlos.....
(und static const string _theTestFuncName = string("FUNC"); funktioniert auch, aber ich möchte ja den Namen der Funktion da drinne haben und nicht den string "FUNC".....)
-
static const string _theTestFuncName = string(FUNC);Du übergibst hier keinen String.

static const string _theTestFuncName = string(#FUNC);Sollte das problem lösen. Das # wandelt FUNC in einen String um
-
Danke! Das war's!
Ist doch unglaublich, wie man sich vom Compiler verar... lassen kann.....
