C Funktion mit zwei Funktionsrümpfen

Gast #6370593
Hallo,
ich weiß gar nicht wie ich das Problem wirklich benennen soll, daher war 
eine Suche für mich schwierig. Wenn es dazu dennoch einen Namen und auch 
Infos gibt, bin ich für Links dankbar.
Beim unten stehenden Code sind zwei Funktionsrümpfe. Gesehen bei einem 
Lieferanten(kann leider nicht öffentlich kopiert werden). Was bewirkt 
das Ganze?
Danke und Gruß
1
void func(int a)
2
{
3
 void;
4
}
5
{
6
 // do something
7
}
Gast
Mir fällt da jetzt auch keine Situation ein, in der sowas gültig wäre - 
zumindest nicht in C, in C++ könnte ich mir da zumindest eventuell was 
ausdenken, um das mit einem Macro Kompilierbar zu kriegen...

Was ich in C manchmal mache, ist einen Codeteil in einen separaten Scope 
zu packen:
1
int main(){
2
  int a = 1;
3

4
  {
5
    int a = 2; // Different a
6
    int b = 4;
7
    // a is 2, b is 4
8
  }
9
  // a is still 1 here, b doesn't exist here
10
}

Ist aber vermutlich was anderes.
gcc meldet Fehler!

pi@raspberrypi:~/test $ gcc test.c
test.c:8:1: error: expected identifier or ‘(’ before ‘{’ token
 {
 ^
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
void x(void)
5
{
6
        printf("erster Teil/r/n");
7
}
8
{ // <== test.c:8:1
9
        printf("zweiter Teil/r/n");
10
}
11

12
int main(void)
13
{
14
        x();
15
}

gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)
Gast
Das ist keine Funktion mit zwei Rümpfen, sondern
- eine Funktion und ein
- unabhängiger Block.

Sowas kenne ich eher aus anderen Programmiersprachen als C/C++. Da kann 
man so Modulinitialisierungen durchführen, die dann ausgeführt werden, 
wenn das Modul geladen wird, in dem dieser Block steht. Aber auch da 
gilt das i.d.R. nicht gerade als guter Stil, weil nicht so genau 
festgelegt ist, wann der Block ausgeführt werden soll. Ggfs nicht einmal 
wie oft (wenn das Modul mehrere male geladen wird).
leo schrieb:
> Schwafel. Zeig doch mal ein compilierbares Beispiel.
1
#include <stdio.h>
2

3
#define Xprintf(x) printf(x); {
4
#define Yprintf(x) } printf(x);
5

6
void x(void)
7
{
8
        Xprintf("erster Teil\n");
9
}
10
{ // <== test.c:10:1
11
        Yprintf("zweiter Teil\n");
12
}
13

14
int main(void)
15
{
16
        x();
17
}
Gast
> Beim unten stehenden Code sind zwei Funktionsrümpfe. Gesehen bei einem
> Lieferanten(kann leider nicht öffentlich kopiert werden). Was bewirkt
> das Ganze?
> Danke und Gruß
>
>
1
> void func(int a)
2
> {
3
>  void;
4
> }
5
> {
6
>  // do something
7
> }
8
>

Eben: zeige DAS GANZE! Zumindest etwas kompilierbares.

WENN darüber noch ein Funktionskopf STÜNDE, so WÄRE func(...) eine 
lokale Funktion. VIELEICHT.
Gast
Jim M. schrieb:
> Nested Function?
> Siehe: https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

"If you try to call the nested function through its address after the 
containing function exits, all hell breaks loose."

Wer mit dem Gedanken an nested functions spielt, sollte sich obigen Satz 
aus der GCC Doku zu Herzen nehmen. Die nested functions liegen auf dem 
stack und machen ihn executable, d.h. bei Pufferüberlauf den Exploitcode 
reinschreiben und direkt hinein springen.

Es gibt wirklich nur sehr wenige Anwendungsfälle, in denen diese Form 
der nested functions gerechtfertigt sein mag.
Gast
Gerald K. schrieb:
> leo schrieb:
>> Sehr witzig. Damit erzeugst du verschachtelte Scopes.
>
> Nein, eine { - Klammer zu viel.

Fein. Probier das eventuell nochmal, nachdem du die gesamte Post von 
"Εrnst B. (ernst)" sinngemaess erfasst hast, auf die sich dieses bezog.

Danke, leo.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.