Forum: Compiler & IDEs Ich verstehe die Welt nicht mehr - C Springt nicht in Funktion WTF?


von Frank (Gast)


Lesenswert?

1
#include <stdio.h>
2
#include <stdlib.h>
3
4
double y1(double x);
5
6
int main()
7
{
8
    y1(4);
9
    return 0;
10
}
11
12
double y1(double x){
13
    printf("fjjfeifeifj");
14
    return 5;
15
}

Wieso in aller Welt gibt mir hier C keine Ausgabe fjjfeifeifj?
Kann das irgendjemand verstehen?

von Zeilenvorschub (Gast)


Lesenswert?

Gib mal ein Linefeed (\n) mit aus.

von Dr. Sommer (Gast)


Lesenswert?

Unter POSIX Systemen gibt es bereits eine Funktion namens "y1", und die 
rufst du auf.

"The y0() and y1() functions return Bessel functions of x of the second 
kind of orders 0 and 1, respectively."

von Frank (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Unter POSIX Systemen gibt es bereits eine Funktion namens "y1", und die
> rufst du auf.

AHAA!
Vielen dank!

von Dirk B. (dirkb2)


Lesenswert?

Dr. Sommer schrieb:
> Unter POSIX Systemen gibt es bereits eine Funktion namens "y1", und die
> rufst du auf.

Muss da nicht der Linker schimpfen?
Und sollte das nicht nur passieren, wenn die mlib mit eingebunden wird?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

y1 auf der libm wird nur dann verwendet, wenn nicht bereits eine 
Implementierung vorliegt -- was im im obigen Beispiel der Fall ist.

Jedenfalls ist das das Verhalten von GNU ld, von dessen Verwendung man 
beim Einsatz von GCC wohl ausgehen darf.

von Rolf Magnus (Gast)


Lesenswert?

Dirk B. schrieb:
> Dr. Sommer schrieb:
>> Unter POSIX Systemen gibt es bereits eine Funktion namens "y1", und die
>> rufst du auf.
>
> Muss da nicht der Linker schimpfen?
> Und sollte das nicht nur passieren, wenn die mlib mit eingebunden wird?

Nein, denn y1 ist bereits im gcc selbst implementiert und braucht daher 
gar keine libm.
Wenn man die eigene Forward-Deklaration weglässt, kommt dann auch:

Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion 
»y1« [standardmäßig aktiviert]

Johann L. schrieb:
> y1 auf der libm wird nur dann verwendet, wenn nicht bereits eine
> Implementierung vorliegt -- was im im obigen Beispiel der Fall ist.

Richtig. Es liegt die vor, die der Compiler schon mitbringt.
Es scheint sich um irgendeine Erweiterung zu handeln, daß er die 
bevorzugt. Wenn man dem Compiler z.B. -ansi oder -std=c99 mitgibt, nutzt 
er die vom Benutzer definierte Funktion.

von X-X (Gast)


Lesenswert?

Dr. Sommer schrieb:
> "The y0() and y1() functions return Bessel functions of x of the second
> kind of orders 0 and 1, respectively."

Kommt denn keine Warnung wenn man so etwas neu definiert?

von (prx) A. K. (prx)


Lesenswert?

X-X schrieb:
> Kommt denn keine Warnung wenn man so etwas neu definiert?

Kommt nicht, sollte m.E. aber.

von X-X (Gast)


Lesenswert?

A. K. schrieb:
> X-X schrieb:
>> Kommt denn keine Warnung wenn man so etwas neu definiert?
>
> Kommt nicht, sollte m.E. aber.

Du musst also jeden deiner Funktionsaufrufe gegen jeden in allen 
zulinkbaren libs evtl. vorhandenen Funktionsnamen gegenchecken um das 
Problem zu vermeiden?

Das wäre doch noch nicht einmal in der eigenen IDE portabel da der 
Sourcecode Projektabhängig wird.

von (prx) A. K. (prx)


Lesenswert?

X-X schrieb:
> Du musst also jeden deiner Funktionsaufrufe gegen jeden in allen
> zulinkbaren libs evtl. vorhandenen Funktionsnamen gegenchecken um das
> Problem zu vermeiden?

Nein. Denn einen Konflikt mit Libs und dem Linker besteht hier nicht, 
wie Rolf bereits dargelegt hat. Diese (Pseudo-)Funktionen sind im 
Compiler integriert und werden direkt als Code erzeugt.

Schlimmer: Du musst theoretisch alle deine Funktionen gegen solche 
Compiler-Intrinsics checken. Und dazu erst einmal wissen, welche es 
überhaupt gibt. Oder wie skizziert auf Standard schalten, also 
beispielsweise -std=c99, was freilich auch unerwünschte Nebeneffekte 
hat.

In vielen Fällen merkst du das jedoch, weil die Signatur deiner Funktion 
nicht zur internen Funktion passt, und du eine entsprechende Meldung 
kriegst. Hier allerdings passt sie.

von X-X (Gast)


Lesenswert?

A. K. schrieb:
>> Kommt denn keine Warnung wenn man so etwas neu definiert?
> Nein.
Ist das bei allen compilern so oder GCC spezifisch?

>Denn einen Konflikt mit Libs und dem Linker besteht hier nicht,

wäre mir ziemlich egal ob so etwas mit irgendeiner reinen Lehre konform 
geht.

> In vielen Fällen merkst du das jedoch, weil die Signatur deiner Funktion
> nicht zur internen Funktion passt

Ist aber reine Glückssache.

> Schlimmer: Du musst theoretisch alle deine Funktionen gegen solche
> Compiler-Intrinsics checken.

warum macht der Compiler das nicht selbst?

> Und dazu erst einmal wissen, welche es überhaupt gibt.

Was er ja weiß, meiner Meinung nach schwer zumutbar da leicht zu 
verhindern.

von X-X (Gast)


Lesenswert?

Noch ne kurze Frage als "C Halbtagsexperte"

Hab bei meinem Compiler mal die Funktion double asin(double x); 
definiert.

Wenn ich die Ansi math lib im Projekt auswähle (nennt man das 
dazulinken) bekomme die Fehlermeldung:

asin identifier redefined

Ist das Problem für mich damit erledigt?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. K. schrieb:
> Diese (Pseudo-)Funktionen sind im
> Compiler integriert und werden direkt als Code erzeugt.

I.d.R aber nur bei bekanntem Argument, ansonsten kann der Compiler da 
auch nichts richten, etwa wie bei den Bessel-Funktionen oben.

> Schlimmer: Du musst theoretisch alle deine Funktionen gegen solche
> Compiler-Intrinsics checken. Und dazu erst einmal wissen, welche es
> überhaupt gibt. Oder wie skizziert auf Standard schalten, also
> beispielsweise -std=c99, was freilich auch unerwünschte Nebeneffekte
> hat.

Möglich ist auch -fno-builtin oder -fno-builtin-y1.  Die Builtins im GCC 
sind dokumentiert, die unterstützen Builtins jedoch abhängig von der 
GCC-Version.

http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

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.