Was bedeutet extern "C"?

OP #3059395
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?
#3059431
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.

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