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