2015-11-06 7 views
10

aufgerufen werden kann ich mich gefragt, ob es möglich ist, ein Makro zu schreiben, die wie folgt verhält:C Präprozessor: ein Makro #define, die ohne Klammern

void Func(int x) 
{ 
    printf("%d",x); 
} 

#define func Func x //or something 

int main() 
{ 
    func 10; //<---- remove parenthesis 
} 

In diesem Fall wird func auf die reale Funktion zeigen Func, und 10 wird sein Argument ohne die Klammer sein.

Ich versuche, etwas ähnlich den new Operator in C++ zu erreichen, aber in C.

Beispiel:

class Base* b = new(Base); 

In diesem Fall class ist ein Makro für struct, ist new eine Funktion welches einen Funktionszeiger annimmt, und Base ist eine Funktion, die Speicher für struct Base reserviert.

Ich möchte den Code, so etwas umschreiben:

class Base* b = new Base; 

Welche möglich sein wird, wenn ich mit einem Makro kann kommen :)

+1

Sollte kein Makroparameter in Klammern sein? – Matso

+0

Nun, diese "Funktionsmakros" haben normale Funktionssyntax, wie '#define func (x) Func (x)'. Der Anruf wäre wie eine normale Funktion, z.B. 'func (10)'. Ist es das was du willst? –

+0

@Ehsan es ist keine C++ Frage, sein reines C und haben alles mit Preprocessors Mate zu tun – Mamma

Antwort

2

Lustig genug können Sie nur new Weg (#define new) definieren und definieren ein Token für jede Konstruktor-ähnliche Funktion, die einen echten Funktionsaufruf mit Klammern erzeugt, wie #define BASE Base().

dass die folgenden Code Recht C machen sollte:

#define new 
#define class struct 
#define BASE Base() 

// forward declaration 
class Base; 
extern class Base *Base(); 

void f() 
{ 
    class Base* b = new BASE; 
} 
+0

HAHAHAHA hat funktioniert: D Ich kann Klasse Base schreiben * b = new Base(); jetzt, Prost, Kumpel. Das wird ein Trollfest. Cheers Kumpel – Mamma

+0

Ja, das war einfach, war es nicht ;-). Ein Wort der technischen Vorsicht (zusätzlich zu den allgemeinen Worten der Vorsicht von Joachim und MM): 'extern class Base * Base();' würde nicht in C++ kompilieren, weil die struct Tags (hier 'Base' von' struct Base') leben in einem anderen "Namensraum" in C, aber nicht in C++, wo sie richtige Typnamen bilden und daher mit dem Funktionsnamen kollidieren. –

+0

Ye ich schrieb etwas vom Code so neu Base (Argumente ...) kann genau wie in C++ verwendet werden, seine Art von cool. Vielen Dank Kumpel – Mamma

1

ich dich nicht denken kann, was Sie wollen. Wenn Sie ein Makro mit einem Parameter haben, wie #define func(x) Func(x), dann müssen Sie es nennen, wie Sie eine Funktion aufrufen würden:

#define func(x) Func(x) 
func(x) // Will be replaced by Func(x) during pre-processing 

Wenn Sie ein Makro ohne Parameter haben, dann wird der Wert einfach während prä- ersetzt Verarbeitung:

#define MY_VAL 110 
func(MY_VAL) // Will be replaced by Func (110) during pre-processing 

Es ist leicht genug ist, um die erste Halterung ...

#define func Func(
func 10); 

... ist vollkommen gültig, aber ziemlich seltsam zu entfernen. Ich glaube nicht, dass es eine Möglichkeit gibt, die schließende Klammer zu entfernen, leider.

Wie Joachim Pileborg in seinen Kommentaren darauf hingewiesen, sehe ich keinen guten Grund, das in einem echten C Programm zu tun.