C++ frage: rekursion in Macro

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

C++ frage: rekursion in Macro

Beitrag von rechenzentrum » 04.02.2014 05:02:17

Hallo,

seit langen habe ich ein Problem: per Macro-Befehl ein weiteren Macrobefehl definieren. Da man in define keine Sonderzeichen wie # oder . benutzen kann(und zum Teil auch nicht uebergeben), kann ich keine Loesung finden. typedef ist auch keine Loesung, weil ebenfalls keine Sonderzeichen erlaubt sind.
Ich habe versucht das Problem mit Templates zu loesen, was zum einen auch keine Loesung bietet und zu anderen templates nur in Verbindung mit einer Klasse, Funktion, in den Einsatz gebracht werden koennen.


Was ich machen moechte ist sehr einfach:

Code: Alles auswählen

#define SET_VAR(name) #define VAR name

int varname=1;
SET_VAR(varname) 
VAR++;

Benutzeravatar
shoening
Beiträge: 897
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ Profi frage # in Macro

Beitrag von shoening » 04.02.2014 08:47:23

Hi,

ich glaube, dass das was Du vorhast (zumindest das, was ich aus dem Beispiel herauslese) nicht funktionieren kann, weil die Macros vom C/C++-Praeprozessor aufgeloest werden. D.h. es findet einmal eine Textersetzung statt, und dann war es das.

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: C++ Profi frage # in Macro

Beitrag von peschmae » 04.02.2014 10:10:03

Man könnte natürlich einen externen Makroprozessor verwenden wie z.B. m4 um sowas zu generieren. Allerdings hat sowas imo ein grosses Mass an Schrecklichkeit an sich ;)

Eventuell würde es helfen wenn du erzählen würdest was denn das eigentliche Problem ist, was du zu lösen versuchst?

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Benutzeravatar
schorsch_76
Beiträge: 2535
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ Profi frage # in Macro

Beitrag von schorsch_76 » 04.02.2014 15:23:33

Was du eigentlich willst ist eine Referenz. Einen andern Namen für eine Variable, welche aber die ursprüngliche variable referenziert.

Code: Alles auswählen

#include <iostream>
void mache(int& var)
{
   var++;
}

int main(int argc, char** argv)
{
   int a = 1;
   std::cout << "Vorher: " << a << std::endl;
   mache(a);
   std::cout << "Nachher: " << a << std::endl;
}
Edit:
dein Beispiel:

Code: Alles auswählen

int varname = 1;
int& var = varname;
var++;

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: C++ Profi frage # in Macro

Beitrag von wanne » 04.02.2014 15:59:53

Sag mal was du machen willst.

Sonst ein paar anmerkungen: Den Präprozessor gibts in C++ zwar noch aus kompatibilitätsgründen gilt aber als veraltet und sollte nicht mehr genutzt werden.
rot: Moderator wanne spricht, default: User wanne spricht.

rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

Re: C++ Profi frage # in Macro

Beitrag von rechenzentrum » 10.02.2014 02:00:17

Hallo Danke fuer eure Antworten!

Der Grund warum ich so umstaendlich auf eine Variable zugreifen moechte ist, dass verschiedene Module vom Server kontrolliert werden. Wenn ich mit einerm Macro die Namen vereinheitlichen koennte, dann muss ich die Module nicht standartisieren. Da es scheinbar nicht geht, werde ich die ganzen Module ortnen und standartisieren muessen. Die Entwicklung der weiteren Module muessen dann anhand des Standarts entwickelt werden.
Was eigentlich schade ist, weil der Server nur auf 2 Variablen zugreifen muss.

Eine Globale Referenz kommt leider nicht in Frage, weil mehere Module gleichzeitig in einer Library vorhanden sind.


Das Preprozessors von einigen Leuten als Veraltet gelten, ist mir bewusst. Weil Preprozessoren relativ Maechtig sind(bis auf das sie nicht rekursiv funktionieren, etc...) kann ich sie nicht aufgeben, Sie sind eine gute Methode den Code zu vereinfachen.

von m4 habe ich glaube ich schon einmal gehort, ich erkundige mich mal.


Danke fuer eure Antworten!
RZ

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: C++ Profi frage # in Macro

Beitrag von wanne » 10.02.2014 02:56:11

rechenzentrum hat geschrieben:Weil Preprozessoren relativ Maechtig sind(bis auf das sie nicht rekursiv funktionieren, etc...) kann ich sie nicht aufgeben, Sie sind eine gute Methode den Code zu vereinfachen.
Nein, der Präprozessorist strohdumm alles was der preprozessor kann, kann in C++ mehr oder weniger gleich nur mit viel mehr zusatzmöglichkeiten umgesetzt werden. Mit dem unterschied, dass letzteres dem compiler erlaubt zu optimieren.
rechenzentrum hat geschrieben:Eine Globale Referenz [...] weil mehere Module gleichzeitig in einer Library vorhanden sind.
Ich verstehe nicht so richtig was du meinst. Module gibt es in C++ noch nicht.
Aber du kannst den Sichtbarkeitsbereich deiner Variable auf jeden "einstellen", den du auch mit einem Macro hättest.

PS: Könntest du in Zukunft etwas aussagegräftige Betreffe wählen? Abgesehen davon, dass es hier um grundsätzliches Verständnis des C-Präprozessors geht sag "Profi Frage" gar nichts über den Inhalt aus.
rot: Moderator wanne spricht, default: User wanne spricht.

rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

Re: C++ frage: rekursion in Macro

Beitrag von rechenzentrum » 13.02.2014 10:50:07

Hallo,

mit Module meine ich c++-Dateien die gewissen Funktionen in einem Server-Framework realisieren.

Das Preprozessor nicht so dolle sind ist mir bewusst, allerdings ist die Platzhalter Funktion genual.
Es ist z.B. Praktisch eine for schleife, dessen Inhalt im Kontext eines Vectors steht folgendermassen abzukuerzen:

Code: Alles auswählen

FOR(vector_A)
{
    string s = tostring(i) + "/" + tostring(vec.size());

vec[i]. ....

}

Benutzeravatar
schorsch_76
Beiträge: 2535
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ frage: rekursion in Macro

Beitrag von schorsch_76 » 13.02.2014 14:37:02

C++11

Code: Alles auswählen

std::vector<int> vec = {10 , 20}; 

for (int i : vec )  
{ 
    std::cout << i; 
}
http://www.cprogramming.com/c++11/c++11 ... -loop.html

Antworten