Kann ein funktionsähnliches Makro mit einem variablen Körper definiert werden?

8

Ich habe mir die GCC-Dokumentation zur Definition von Makros angesehen und es sieht so aus, als ob ich es möchte ist nicht möglich, aber ich denke, wenn es ist, würde jemand hier wissen.

Was ich tun möchte, ist dieses Makro zu definieren:

%Vor%

Welche erweitert zu:

%Vor%

In C ++ könnte ich einfach ein SynchronizedBlock -Objekt machen, das die Sperre in seinem Konstruktor bekommt und im Destruktor freischaltet, aber ich habe keine Idee, wie man es in C macht.

Ich weiß, dass ich einen Funktionszeiger in der Form synchronized(x, &myfunction); verwenden könnte, aber mein Ziel ist es, C-Code so ähnlich wie Java aussehen zu lassen. Und ja, ich weiß, das ist böse.

    
Brendan Long 27.10.2010, 19:37
quelle

4 Antworten

16

BEARBEITEN : In Version von nategoose geändert

%Vor%

Und Sie können es so verwenden:

%Vor%

Oder auch ohne Klammern

%Vor%     
Joe D 27.10.2010, 20:05
quelle
4

Hier ist ein Anfang, aber Sie müssen es vielleicht optimieren:

%Vor%

Verwenden Sie so (leider nicht die Java-ähnliche Syntax, die Sie wollten):

%Vor%     
Jonathan 27.10.2010 19:42
quelle
2

Sehr interessante Frage!

Ich schaute mir die anderen Antworten an und mochte die mit for . Ich habe eine Verbesserung, wenn ich darf! GCC 4.3 führt das Makro COUNTER ein, mit dem wir eindeutige Variablennamen generieren können.

%Vor%

Verwenden Sie diese Makros, diesen Code ...

%Vor%

... wird zu ... erweitert.

%Vor%

Mit my_mutex__n beginnend mit 0 und jedes Mal, wenn es verwendet wird, wird ein neuer Name generiert! Sie können die gleiche Technik verwenden, um monitorähnliche Code-Stellen mit einem eindeutigen, aber unbekannten Namen für den Mutex zu erstellen.

    
slezica 27.10.2010 21:19
quelle
1

Das war das Beste, was mir einfiel:

%Vor%

Beachten Sie, dass Sie den selten verwendeten Kommaoperator verwenden müssen und dass der Code in der (nicht ganz Java-ähnlichen) Synchronisationscodeliste eingeschränkt ist.

    
nategoose 27.10.2010 20:08
quelle

Tags und Links