C++ Funktion aufrufen als ( (fn) (arg1, arg2, ... ));
-
Hi,
ich denke das ist eine C++ Frage habe diese Art des Funktionsaufrufs in einem Windows Buch von Jeffrey Richter gesehen ( dort war es als #define... deklariert).
Hab's dann mal getestet um zu sehen ob man Funktionen so aufrufen kann...
void Add( int a, int b, int &c ) { c = a + b ; }und dann der Aufruf...
int a = 12; int b = 13; int erg = 0; ( (Add) (a, b, erg) ); std::cout << "a+b: " << erg << std::endl;Ich kann mich dunnkel daran erinnern, das ich sowas entfernt ähnliches bei Callbacks gesehen habe, aber sonst nicht.
Wieso funktioniert das? Ich komme mit der Syntax in diesem Aufruf nicht klar.Gruß
-
(Add) (2, 4, a);So kann man es auch aufrufen. Da sich eine Funktion implizit in einen (Fkt.-)Pointer casten lässt, schätze ich mal, dass es keinen Unterschied macht, ob man jetzt die Klammern weg lässt oder nicht (der Ausdruck in den Klammern wird dann halt zuerst ausgewertet, und da verändert sich nix).
Vielleicht optimiert der Compiler das ja auch (also aus(5)wird wahrscheinlich5,(indentifier)wird zuindentifierusw.)
-
Hab grad mal etwas damit rumgespielt:
void foo( int, int ) {} int main() { foo( 1, 2 ); // normaler Aufruf (foo) (1, 2); // nur Funktionsname umklammert ( foo( 1, 2 ) ); // nur Aufruf umklammert ( (foo) (1, 2) ); // beides umklammert (( (foo) (((1)), ((2))) )); // noch ein paar Klammern mehr ;) }Nette obfuscation.

Gleich kommt sicher jemand, der die passende Stelle aus dem Standard dazu zitiert.
-
Meinst du die Klammerung, oder 4.3 (1) (aus dem hier)?
-
Da gibts nichts aus dem Standard zu zitieren. Man kann jeden Ausdruck beliebig mit Klammern einschachteln, natürlich auch Funktionsbezeichner. Naja vielleicht kann man die Grammatik zitieren, aber das bringt es wohl nicht.
-
"785 Grammar summary A.3 Basic concepts" vielleicht?
A.4 Expressions [gram.expr]
primary-expression:
literal
this
( expression )
id-expressionDefiniert müsste es ja schon irgendwo sein, dass man es darf. Ansonsten könnte in irgendeiner anderen Sprache (a) ja auch ein 1-tuple mit a als einziges Element sein, das nicht implizit auch == a ist wie z.B in Python ( http://codepad.org/pNK5Dlqw ).
-
1-Tupel macht man in Python so:
a = (1,)Ansonsten stimmt das natürlich, das steht implizit in der Grammatik. Mein Punkt ist, dass es für Funktionen nicht gesondert aufgeführt ist. Dass man um arithmetische Ausdrücke Klammern setzen darf, darüber hat sich jedenfalls noch nie einer gewundert...
-
Ah, mit Komma, ok, thx.

-
Hi,
ok! Danke also nur 'ne Klammerung. Wollte schon bei Jeffrey anrufen und das mal abklären.
Gruß