| Autor |
Nachricht |
FrankTheFox
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.02.2007
Beiträge: 215
|
FrankTheFox Mitglied
15:45:22 13.04.2012 Titel: |
C++ Funktion aufrufen als ( (fn) (arg1, arg2, ... )); |
Zitieren |
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...
| C++: | void Add( int a, int b, int &c )
{
c = a + b ;
} | |
und dann der Aufruf...
| C++: | 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ß |
_________________ Im void dahoam!
Zuletzt bearbeitet von FrankTheFox am 15:46:31 13.04.2012, insgesamt 1-mal bearbeitet |
|
 |
Unregistrierter
|
Unregistrierter
15:59:07 13.04.2012 Titel: |
|
Zitieren |
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 wahrscheinlich 5, (indentifier) wird zu indentifier usw.) |
|
|
|
 |
Dobi
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 672
|
Dobi Mitglied
15:59:10 13.04.2012 Titel: |
|
Zitieren |
Hab grad mal etwas damit rumgespielt:
| C++: | 1 2 3 4 5 6 7 8 | 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. |
|
|
|
 |
Unregistrierter
|
Unregistrierter
16:05:27 13.04.2012 Titel: |
|
Zitieren |
Meinst du die Klammerung, oder 4.3 (1) (aus dem hier)? |
|
|
|
 |
Bashar
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17742
|
Bashar Mitglied
16:10:59 13.04.2012 Titel: |
|
Zitieren |
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. |
_________________ OSL♥
|
|
 |
Dobi
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 672
|
Dobi Mitglied
16:33:29 13.04.2012 Titel: |
|
Zitieren |
"785 Grammar summary A.3 Basic concepts" vielleicht?
| Zitat: | A.4 Expressions [gram.expr]
primary-expression:
literal
this
( expression )
id-expression |
Definiert 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 ). |
|
|
|
 |
Bashar
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17742
|
Bashar Mitglied
16:40:54 13.04.2012 Titel: |
|
Zitieren |
1-Tupel macht man in Python so:
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... |
_________________ OSL♥
|
|
 |
Dobi
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 672
|
Dobi Mitglied
16:43:21 13.04.2012 Titel: |
|
Zitieren |
Ah, mit Komma, ok, thx. |
|
|
|
 |
FrankTheFox
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.02.2007
Beiträge: 215
|
FrankTheFox Mitglied
23:10:03 13.04.2012 Titel: |
|
Zitieren |
Hi,
ok! Danke also nur 'ne Klammerung. Wollte schon bei Jeffrey anrufen und das mal abklären.
Gruß |
_________________ Im void dahoam!
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|