Forum: PC-Programmierung C Funktion mit zwei Funktionsrümpfen


von HalbLeer (Gast)


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
}

von Jim M. (turboj)


Lesenswert?

Nested Function?
Siehe: https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

Ansonsten hätte ich da einen Compiler Fehler erwartet.

von Vincent H. (vinci)


Lesenswert?

HalbLeer schrieb:
> Was bewirkt das Ganze?

<source>:3:2: error: declaration does not declare anything 
[-fpermissive]

    3 |  void;

      |  ^~~~

<source>: At global scope:

<source>:5:1: error: expected unqualified-id before '{' token

von ? DPA ? (Gast)


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.

von Gerald K. (geku)


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)

: Bearbeitet durch User
von Ranzrunz (Gast)


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).

von leo (Gast)


Lesenswert?

Ranzrunz schrieb:
> Sowas kenne ich eher aus anderen Programmiersprachen als C/C++.

Schwafel. Zeig doch mal ein compilierbares Beispiel.

leo

von Εrnst B. (ernst)


Lesenswert?

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
}

von leo (Gast)


Lesenswert?

Εrnst B. schrieb:
> #define Xprintf(x) printf(x); {

Sehr witzig. Damit erzeugst du verschachtelte Scopes.

leo

von Mark B. (markbrandis)


Lesenswert?

HalbLeer schrieb:
> Was bewirkt das Ganze?
> Danke und Gruß
>
>
1
> void func(int a)
2
> {
3
>  void;
4
> }
5
> {
6
>  // do something
7
> }
8
>

Es bewirkt Fehler beim Übersetzen, weil es kein gültiger C-Code ist.

von Glaskugelmaschinist (Gast)


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.

von Thomas W. (goaty)


Lesenswert?

Vielleicht ist es auch in einem foo.h und bar.c macht #include <foo.h>
(Obfuscated C Contest ?)

: Bearbeitet durch User
von Kiudi (Gast)


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.

von Thomas W. (goaty)


Lesenswert?

Stimmt, heute gibt es ja Lambda.

von Oliver S. (oliverso)


Lesenswert?

Kiudi schrieb:
> Die nested functions liegen auf dem
> stack

Auf welcher Plattform soll das denn so implementiert sein?

Oliver

: Bearbeitet durch User
von Kiudi (Gast)


Lesenswert?

Oliver S. schrieb:
> Kiudi schrieb:
>> Die nested functions liegen auf dem
>> stack
>
> Auf welcher Plattform soll das denn so implementiert sein?

x86, amd64

von Oliver S. (oliverso)


Lesenswert?

Kiudi schrieb:
> Oliver S. schrieb:
>> Kiudi schrieb:
>>> Die nested functions liegen auf dem
>>> stack
>>
>> Auf welcher Plattform soll das denn so implementiert sein?
>
> x86, amd64

https://godbolt.org/z/sMc16W

Sehr seltsam, aber wahr.

Oliver

: Bearbeitet durch User
von Gerald K. (geku)


Lesenswert?

leo schrieb:
> Sehr witzig. Damit erzeugst du verschachtelte Scopes.

Nein, eine { - Klammer zu viel.

von Εrnst B. (ernst)


Lesenswert?

Gerald K. schrieb:
> Nein, eine { - Klammer zu viel.

Die Anzahl der Klammern hat schon gepasst.

Aber der Post war natürlich als Scherz gedacht, falls das Einigen nicht 
aufgefallen ist.
Ich hab kein ";)" dahintergepackt weil der Compiler sonst gemeckert 
hätte.

von leo (Gast)


Lesenswert?

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.

von Gerald K. (geku)


Lesenswert?

Sorry!
Passt, hatte die Klammer im zweiten Define übersehen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.