Forum: Mikrocontroller und Digitale Elektronik Was bedeutet extern "C"?


von Joachim .. (joachim_01)


Lesenswert?

Was ich schon immer mal wissen wollte:
1
/// @cond 0
2
/**INDENT-OFF**/
3
#ifdef __cplusplus
4
extern "C" {
5
  #endif
6
  /**INDENT-ON**/
7
  /// @endcond
8
9
10
// bla
11
// bla
12
13
14
/// @cond 0
15
/**INDENT-OFF**/
16
#ifdef __cplusplus
17
}
18
#endif
19
/**INDENT-ON**/
20
/// @endcond

Was hats mit diesem Kunstgriff auf sich? Kann der C++ Compiler denn kein 
C?

Und warum sieht der Syntax:
"C" {
 }
wie ein Funktionsaufruf aus?

von Peter II (Gast)


Lesenswert?

das ist notwendig wenn man ein dll( dynamic lib) baut. Bei C++ wird ein 
name mangling gemacht, bei C nicht. Damit haben die funktionen dann ein 
besseren namen zum aufrufen.

von Karl H. (kbuchegg)


Lesenswert?

Joachim ... schrieb:

> Was hats mit diesem Kunstgriff auf sich?

Damit Object-Module aus unterschiedlichen Programmiersprachen zu einem 
gemeinsamen Programm zusammengelinkt werden können, müssen sich die 
einzelnen Compiler darüber einig sein, wie sie Funktionen benennen bzw. 
welche Aufrufkonventionen gelten sollen. Zb betreiben C++ Compiler ein 
sog. "Name mangling" um die Limitierungen früherer Linker zu umgehen. 
Will man eine Funktion so schreiben, dass sie auch von einem C-Programm 
aufrufbar sein soll, dann teilt man auf diese Art dem Compiler mit, dass 
er sie wie eine C-Funktion verpacken soll.

> Kann der C++ Compiler denn kein
> C?

:-)
Ein C++ Compiler produziert C++ - Object Code.
C und C++ sind erst mal 2 verschiedene Sprachen. Nur weil das eine so 
aussieht, als ob es der andere auch übersetzen kann, bedeutet das nicht 
automatisch, dass hinten aus dem Compiler auch das gleiche rauskommt.

>
> Und warum sieht der Syntax:
> "C" {
>  }
> wie ein Funktionsaufruf aus?

Wo sieht denn das wie ein Funktionsaufruf aus?
Ein Funktionsaufruf sieht so
1
    foo();
aus. Da steht ein Funktionsname gefolgt von einer Argumentliste in ( ). 
Und das ist ja schliesslich ganz was anderes.
Wie überall im Code bedeutet ein { } einfach nur ein Block, in dem 
mehrere Dinge zusammengefasst werden.

In
1
   if( i == 5 )
2
   {
3
     Anweisung1;
4
     Anweisung2;
5
   }
werden durch den { } einfach nur die einzelnen Anweisungen zu einem 
Block zusammengefasst und gelten wieder wie eine Anweisung

In
1
extern "C"
2
{
3
  void foo( void )
4
  {
5
    Anweisung;
6
  }
7
8
  void bar( void )
9
  {
10
    Anweisung;
11
  }
12
}

werden die beiden Funktionen foo und bar zu einer Einheit 
zusammengefasst, für die die Eigenschaft 'extern "C"' gelten soll. 
Genausogut hätte man auch
1
extern "C" void foo( void )
2
{
3
  Anweisung;
4
}
5
6
extern "C" void bar( void )
7
{
8
  Anweisung;
9
}

schreiben können.

von Joachim .. (joachim_01)


Lesenswert?

Karl Heinz hat mich wieder mal geplättet ;-)

Danke euch beiden.

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.