Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Funktion in Funktion definieren     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
WHATISTHAT
Unregistrierter




Beitrag WHATISTHAT Unregistrierter 17:09:20 02.09.2010   Titel:   Funktion in Funktion definieren            Zitieren

Ich bin über dieses kleine Programm gestolpert. Aber wenn ich das jetzt mit dem G++ kompiliere funktioniert es nicht. mit dem GCC schon. Gibt es nicht etwas ähnliches in C++?

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
    int funcinfunc()
    {
        return 1;
    }
    if(funcinfunc())
        printf("TRUE\n");

}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
int funcinfunc()
{
return 1;
}
if(funcinfunc())
printf("TRUE\n");

}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
    int funcinfunc()
    {
        return 1;
    }
    if(funcinfunc())
        printf("TRUE\n");

}
berniebutt
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.11.2007
Beiträge: 2219
Beitrag berniebutt Mitglied 17:46:33 02.09.2010   Titel:              Zitieren

Das scheint eine Grauzone der Compiler-Hersteller zu sein.

Genormt in C und C++ ist die separate Deklaration von Funktions-Prototypen bereits vor deren Einsatz, damit der Compiler diese sauber erkennen kann.
Selbst wenn dein Compiler so etwas zulässt, tust du dir keinen grossen Gefallen und kannst nicht erwarten, dass andere Compiler das so mitmachen!

_________________
http://berniebutt.npage.de
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 9599
Beitrag _matze Mitglied 17:52:44 02.09.2010   Titel:              Zitieren

Ich sehe auch den Vorteil solcher Funktionsdefinitionen nicht.

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
BadWolf
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.12.2009
Beiträge: 97
Beitrag BadWolf Mitglied 22:42:33 02.09.2010   Titel:              Zitieren

Hmmm, keine Ahnung, wie's mit Standard aussieht, aber MSVC unterstützt sowas:

C/C++ Code:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
int main()
{
    struct func {
       int operator() () { return 1; }
    } funcinfunc;

    cout << funcinfunc() << endl;
}
C/C++ Code:
1
2
3
4
5
6
7
8
int main()
{
struct func {
int operator() () { return 1; }
} funcinfunc;

cout << funcinfunc() << endl;
}
C/C++ Code:
1
2
3
4
5
6
7
8
int main()
{
    struct func {
       int operator() () { return 1; }
    } funcinfunc;

    cout << funcinfunc() << endl;
}


Und mit C++0x natürlich per Lambda-Funktion:

C/C++ Code:
int main()
{
    auto funcinfunc = [] () { return 1; };

    cout << funcinfunc() << endl;
}
C/C++ Code:
int main()
{
auto funcinfunc = [] () { return 1; };

cout << funcinfunc() << endl;
}
C/C++ Code:
int main()
{
    auto funcinfunc = [] () { return 1; };

    cout << funcinfunc() << endl;
}
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13597
Beitrag SeppJ Moderator 23:02:30 02.09.2010   Titel:              Zitieren

Der Standard erlaubt keine Funktionen in anderen Funktionen, sowohl in C als auch in C++. Warum dies jedoch als Compilerfeature in der C Variante vom GCC existiert und nicht in der C++ Variante ist mir ein Rätsel (ich kann diese Beobachtung bestätigen). Vielleicht irgendeine Schwierigkeit beim Parsen von C++ die mir nicht einfallen mag? Oder die beiden Compilerteile werden einfach in unterschiedlichen Zweigen entwickelt.
Nexus
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2006
Beiträge: 9700
Beitrag Nexus Mitglied 01:02:15 03.09.2010   Titel:              Zitieren

_matze schrieb:
Ich sehe auch den Vorteil solcher Funktionsdefinitionen nicht.
Ich verstehe generell nicht, weshalb solche Dinge wie eine lokale Struktur so vorteilhaft sein sollen. Die Verfechter argumentieren meist mit grösserer Lokalität. Aber ist es wirklich so ein Unterschied, ob es jetzt
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
void Helper(int x)
{
   // tu was
}

void Function()
{
    Helper(7);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
void Helper(int x)
{
// tu was
}

void Function()
{
Helper(7);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
void Helper(int x)
{
   // tu was
}

void Function()
{
    Helper(7);
}
oder
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
void Function()
{
    struct
    {
        void operator(int x)
        {
            // tu was
        }
    } Helper;

   Helper(7);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
void Function()
{
struct
{
void operator(int x)
{
// tu was
}
} Helper;

Helper(7);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
void Function()
{
    struct
    {
        void operator(int x)
        {
            // tu was
        }
    } Helper;

   Helper(7);
}
heisst? Klar hat man vielleicht noch ein wenig Code darum herum, aber lustigerweise sind die Verfechter oft auch Kurz-Funktionen-Fanatiker. ;)

Den anderen Punkt sehe ich im Sichtbarkeitsbereich. Doch da solche Konstrukte ohnehin meist in .cpp-Dateien vorkommen, sehe ich auch hier kein grosses Problem, wenn ein paar nachfolgende Funktionen prinzipiell den Helper verwenden könnten. Hingegen entsteht etwas mehr Code und mir persönlich ist die Semantik weniger schnell klar als bei einer Extra-Funktion.

Lambda-Funktionen hingegen finde ich echt praktisch, vor allem da sie eine kompakte Syntax besitzen und direkt in einem Ausdruck definiert werden können.
seldon
Unregistrierter




Beitrag seldon Unregistrierter 01:09:57 03.09.2010   Titel:              Zitieren

Es ist in Funktionsvorlagen ein Unterschied.

Allerdings kommt man auch ganz gut ohne zurecht. Ich helfe mir in solchen Fällen in aller Regel entweder mit einem namespace impl o.ä. oder dem namenlosen namespace.
Nexus
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2006
Beiträge: 9700
Beitrag Nexus Mitglied 01:40:40 03.09.2010   Titel:              Zitieren

seldon schrieb:
Es ist in Funktionsvorlagen ein Unterschied.
Templates? Abgesehen von meinem deutschen Visual Studio habe ich schon lange niemanden mehr von "Vorlagen" reden hören. Gleich wie "Verweise" statt "Referenzen". Soll kein Vorwurf sein, ist mir nur aufgefallen... ;)

Zum Thema: Bei Funktionstemplates ist es insofern ein Unterschied, als die externe HelperFunktion eventuell nochmals Template-Parameter braucht. Was oft aber auch noch im Rahmen liegt... Meintest du das?

Wenn es geht (d.h. keine funktionalen Algorithmen), schreibe ich den Code auch oft einfach inline in die Funktion. Vor allem wenn die Indirektion für mich keinen Vorteil hat, nehme ich lieber eine längere als eine fragmentierte Funktion.

seldon schrieb:
Allerdings kommt man auch ganz gut ohne zurecht. Ich helfe mir in solchen Fällen in aller Regel entweder mit einem namespace impl o.ä. oder dem namenlosen namespace.
Genau so handhabe ich das auch. Oft habe ich einen namespace detail, der ist besonders in Template-Implementierungsdateien praktisch, damit der umliegende Namensraum sauber bleibt.
seldon
Unregistrierter




Beitrag seldon Unregistrierter 01:58:38 03.09.2010   Titel:              Zitieren

Naja, "Templatefunktion" ist schlicht falsch, und "Funktionstemplate" klingt irgendwie komisch. Außerdem macht "Funktionsvorlage" sofort klar, worum es sich bei Funktionsvorlagen handelt.

Was ich meinte ist, dass lokale Funktionen in Funktionsvorlagen (und inline-Funktionen, wo ich gerade daran denke) eine Verschmutzung des umgebenden Namensraums mit Symbolen, die nicht zum API gehören, vermeiden helfen könnten. Natürlich ist es völlig akzeptabel (und gängige Praxis), solche Symbole in einen Namensraum auszulagern, dessen Name es völlig klar macht, dass sie nicht zum API gehören, aber ich habe durchaus Verständnis für den Wunsch, auch das zu vermeiden. Jedenfalls macht es da aber einen Unterschied.
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Funktion in Funktion definieren   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, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de 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.