Herr Nilsson
Eroberer
Da manchen Foren lange Offtopic-Diskussion zuwider sind, wollte ich [THREAD=37341]hier[/THREAD] nicht weiter diskutieren, sondern zu einem neuen Thema auch einen neuen Thread eröffnen.
Meines Wissen kann ein C-Compiler keine C++-Aufrufe erzeugen, siehe Beispiel:
Aus der Funktion int getEins(void) wurde vom C-Compiler der Aufruf getEins, vom C++-Compiler der Aufruf _Z7getEinsv generiert. Die hinzugefügten Typsignaturen sind Voraussetzung für die unter C++ erlaubte Überladung von Funktionen.
Nun hat man erkannt, daß durch dieses neue C++-Merkmal der Aufruf von Funktionen aus alten C-Bibliotheken unmöglich wird, weshalb man unter C++ den Compiler anweisen kann, Aufrufe ohne die neuen Typsignaturen aber nach dem alten C-Standard zu erzeugen, siehe [THREAD=35270]hier.[/THREAD] Hierzu mußte der C++-Standard um die sog. Linkage-Spezifikation erweitert werden[1], z.B.:
Nun ist die Frage, ob es auch einen standardisierten C++-Linkage-Befehl für C gibt? Unter [2] wird zumindest ausdrücklich darauf hingewiesen:
[1] Siehe Bjarne Stroustrup, Die C++-Programmiersprache, Referenz-Handbuch, Kapitel R.7.4.
[2] C/C++: Programmer's Reference, Herbert Schildt, Osborne McGraw-Hill, Unterpunkt "LINKAGE SPECIFICATION".
Meines Wissen kann ein C-Compiler keine C++-Aufrufe erzeugen, siehe Beispiel:
Code:
$ cat call.c
int getEins(void) { return 1; }
int main(void)
{
int eins = getEins();
}
$ gcc -c -o call_c.o call.c
$ g++ -c -o call_c++.o call.c
$ objdump -t call_c.o | grep getEins
0000000000000000 g F .text 000000000000000b [COLOR="Red"]getEins[/COLOR]
$ objdump -t call_c++.o | grep getEins
0000000000000000 g F .text 000000000000000b [COLOR="Red"]_Z7getEinsv[/COLOR]
Nun hat man erkannt, daß durch dieses neue C++-Merkmal der Aufruf von Funktionen aus alten C-Bibliotheken unmöglich wird, weshalb man unter C++ den Compiler anweisen kann, Aufrufe ohne die neuen Typsignaturen aber nach dem alten C-Standard zu erzeugen, siehe [THREAD=35270]hier.[/THREAD] Hierzu mußte der C++-Standard um die sog. Linkage-Spezifikation erweitert werden[1], z.B.:
Als String-Literal wird standardmäßig C++ angenommen, es kann aber auch zu C gewechselt werden:extern string-literal declaration
Code:
$ cat call2.cc
extern "C" int getEins(void);
int main(void)
{
int eins = getEins();
}
int getEins(void) { return 1; }
$ [COLOR="Red"]g++[/COLOR] -c -o call2_c++.o call2.c
$ objdump -t call2_c++.o | grep getEins
0000000000000020 g F .text 000000000000000b [COLOR="Red"]getEins[/COLOR]
Nun ist die Frage, ob es auch einen standardisierten C++-Linkage-Befehl für C gibt? Unter [2] wird zumindest ausdrücklich darauf hingewiesen:
"The linkage specification applies only to C++. It is not supported by C."
[1] Siehe Bjarne Stroustrup, Die C++-Programmiersprache, Referenz-Handbuch, Kapitel R.7.4.
[2] C/C++: Programmer's Reference, Herbert Schildt, Osborne McGraw-Hill, Unterpunkt "LINKAGE SPECIFICATION".
Zuletzt bearbeitet: