C Funktion mit zwei Funktionsrümpfen

Gast #6370593
Lesenswert?

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 #6370624
Lesenswert?

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.
#6370681
Lesenswert?

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 #6370727
Lesenswert?

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).
Gast #6370873
Lesenswert?

> 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 #6370889
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren