Dynamische Funktionsnamen möglich?
-
Hallo!
Ist es möglich in C++ dynamische Funktionsnamen zu erstellen?
Beispiel:
Ich habe die Funktionen open(), init() und close().
Diese Namen sollen mit einem Präfix versehen werden, also z.B. abc_open(), abc_init() und abc_close().
Den Präfix "abc_" möchte ich irgendwo zentral definieren, z.B. mit#define PREFIX "abc";
So kann ich schnell eine Änderung über alle Funktionsnamen vornehmen.
Ich kann ja aber meine Funktion nicht alsPREFIX_init();
deklarieren???
Habt ihr eine Idee wie man sowas realisieren kann?Gruß,
dschuller
-
dschuller schrieb:
Ist es möglich in C++ dynamische Funktionsnamen zu erstellen?
Nein. Statisch ja (Und Makros werden vor der Compilezeit ausgewertet).
Davon abgesehen halte ich Präfixe eher für schlecht, wäre ein Namensraum nicht eher die richtige Wahl für dich?
cu André
-
Aber dann musst du auch jedes Mal, wenn du die Funktion benutzt, den Namen beim Aufruf aendern.
-
Wozu soll das gut sein?
-
Um Namensraume zu simulieren, wo keine vorhanden sind, #define und #undef.
-
knivil schrieb:
Um Namensraume zu simulieren, wo keine vorhanden sind, #define und #undef.
Stelle ich mir gerade unglaublich übersichtlich vor.

-
Ich würde auch zu einem Namensraum raten. Wenn du ihn umbenennen willst, kannst du Refactor Tools verwenden. Das kommt natürlich ein wenig auf deine IDE an, ob sowas vorhanden ist. Notfalls gibt es für die meisten IDEs nachrüstbare Tools.
Grüssli
-
Stelle ich mir gerade unglaublich übersichtlich vor.
Wuerde ich so in C machen bzw. wird so bei Tools wie flex/bison gemacht. Ich fand es ueberschaubar. In C++, wo Namensraume vorhanden sind, macht es wenig Sinn.
Stelle ich mir ... vor.
Was du dir vorstellst oder vorstellen kannst, sollte nicht zur Beurteilung herangezogen werden. (sinngemaess aus A.E. Poe, Eureka (der deutsche Wikipediaartikle wird dem Werk aber nicht gerecht) )
-
Versuch mal
#define PREFIX abc int PREFIX##_name();
-
knivil schrieb:
Stelle ich mir gerade unglaublich übersichtlich vor.
Wuerde ich so in C machen bzw. wird so bei Tools wie flex/bison gemacht. Ich fand es ueberschaubar. In C++, wo Namensraume vorhanden sind, macht es wenig Sinn.
Stelle ich mir ... vor.
Was du dir vorstellst oder vorstellen kannst, sollte nicht zur Beurteilung herangezogen werden. (sinngemaess aus A.E. Poe, Eureka (der deutsche Wikipediaartikle wird dem Werk aber nicht gerecht) )
Glaubst du an Gott?

-
Wozu soll das gut sein?
Es geht um Messgerätetreiber.
Ich habe ein Code-Grundgerüst (eine DLL) geschrieben, auf dessen Basis mehrere Treiber enstehen sollen.
Leider kann ich nicht objektorientiert arbeiten, weil die DLL von Umgebungen benutzt werden soll, die keine Instanzen erzeugen können.
Für die Geräte "rs123" und "ag456" muss es also Funktionen "rs123_open()" und "ag456_open()" geben.
Ansonsten könnte man ja nicht beide DLLs gleichzeitig laden.
Und es wäre halt sehr praktisch, wenn ich nicht bei jedem Gerät jeden Funktionsnamen einzeln ändern müsste.Und nebenbei bemerkt:
namespaces kennt die übergeordnete Umgebung (National Instruments TestStand) leider auch nicht.
-
Keine Klassen, keine Namensräume, keine Überladung, wohl auch keine Templates, keine C++ Standardbibliothek ... ehm moment?
Du programmierst in C? Falsches Forum!
:pGrüssli
-
Er.
Eine DLL mit der du einen Treiber schreiben willst?
Usermode-Treiber oderwas?Ansonsten: könntest du nicht einfach Device-IDs verwenden?
In der DLL könntest du dann statisch Platz für N Geräte (10, 100, ... wieviel du halt brauchst) reservieren. Dann muss das Programm welches die DLL verwendet auch keine Instanz mehr anfordern.
Die IDs müsstest du dann natürlich auch statisch (fix) vergeben. Sonst musst du ja wieder "IDs" anfordern. Und wenn du keine Instanzen anfordern kannst, kannst du vermutlich auch keine IDs anfordern.