Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  C++ Funktion aufrufen als ( (fn) (arg1, arg2, ... ));     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
FrankTheFox
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.02.2007
Beiträge: 215
Beitrag 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





Beitrag Unregistrierter 15:59:07 13.04.2012   Titel:              Zitieren

C++:
(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 wahrscheinlich 5, (indentifier) wird zu indentifier usw.)
Dobi
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 672
Beitrag 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





Beitrag 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
Beitrag 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
Beitrag 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
Beitrag Bashar Mitglied 16:40:54 13.04.2012   Titel:              Zitieren

1-Tupel macht man in Python so:
Code:
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...

_________________
OSL♥
Dobi
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 672
Beitrag 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
Beitrag 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!
c++.de :: C++ (auch C++0x und C++11) ::  C++ Funktion aufrufen als ( (fn) (arg1, arg2, ... ));   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.