Warum hat ein `int

Lesezeit: 3 Minuten

(float)` zeigen auf ein `int foo()` lösen eine Warnung aus, aber mit einem `int
(doppelt)` darauf hinweisen, nicht wahr?

justANewb steht mit dem Benutzer-Avatar der Ukraine

int foo() { return 0; }
int main()
{
    int (*float_function)(float) = foo;
}

justANewb steht zur Ukraine x86-64 GCC 12.2Ich habe dieses Stück Code: -WallBeim Kompilieren mitmiterzeugt es die Warnung (

Verknüpfung [-Wincompatible-pointer-types]

): float Warnung: Initialisierung von ‘int double (float)’ vom inkompatiblen Zeigertyp ‘int()’Aber, wenn ich umsteige

int foo(){ return 0;}
int main()
{
    int (*double_function)(double) = foo;
}

Zu

(

Verknüpfung

  • ):

    Die Warnung ist jetzt weg.

    Aber ich denke, dass beide eine Warnung bekommen sollten.

  • Liege ich irgendwo falsch? Warum beschwert sich GCC nicht über das zweite Beispiel?

    Für Hintergrundinformationen gibt es hier eine nette Diskussion über die Kompatibilität von Funktionszeigern: stackoverflow.com/questions/559581/…

    – Nielsen

  • 21. Januar um 9:49 Uhr

    Ich kannte die Antwort auf diese Frage (es liegt an Standard-Argument-Promotions, die bei Aufrufen von nicht prototypischen Funktionen durchgeführt werden) – aber ich wusste nichts über die Typkompatibilität zwischen nicht prototypischen und prototypischen Funktionen – also danke, dass Sie diese Frage gepostet haben.

    – EinArrayOfFunctions


22. Januar um 0:12
Verwandt, wenn kein Duplikat: Kompatibilität von Funktionstypen, die keinen Prototyp enthalten

int foo() –Martin R int 22. Januar um 16:54 Uhr float Benutzeravatar von interjay doublezwischenjay

wird deklariert, ohne seine Parameter anzugeben. Dies ist eine veraltete Funktion, mit der Sie sie mit beliebigen Argumenten aufrufen können. Beim Aufruf der Funktion werden Integer-Argumente hochgestuft float (bei Bedarf) und int (*)(float)Argumente werden gefördert int (*)(double).

Aus diesem Grund ist es für diese Funktion unmöglich, a zu empfangen int foo(void) Parameter, der es inkompatibel mit macht

aber nicht mit double. int foo() {...} Wenn Sie eine Funktion wünschen, die keine Parameter akzeptiert, deklarieren Sie sie als

wodurch es mit beiden inkompatibel wird. int foo(); Beachten Sie, dass auch mit

der Code ist nicht gültig C weil […] ist eine Funktionsdefinition, sodass der Compiler weiß, dass sie keine Parameter hat (siehe den Kommentar von Chux unten für die Standardreferenz). Die meisten Compiler erlauben es immer noch. […] Wenn Sie es durch eine Deklaration ersetzen

  • und die Definition an einer anderen Stelle platzieren, dann ist das obige richtig. In diesem Fall lautet der relevante Standardkurs (C17 6.7.6.3/15): -Wstrict-prototypes Damit zwei Funktionstypen kompatibel sind, -Wall Wenn ein Typ eine Parametertypliste hat und der andere Typ durch einen Funktionsdeklarator angegeben wird, der nicht Teil einer Funktionsdefinition ist und eine leere Bezeichnerliste enthält,

    der Typ jedes Parameters muss mit dem Typ kompatibel sein, der sich aus der Anwendung der Heraufstufungen des Standardarguments ergibt.

    Schöne Erklärung. Das Deklarieren einer Funktion ohne angegebene Parameter kann oft zu Verwirrung führen. Es kann abgefangen werden, indem die Warnung aktiviert wird


  • (NEIN, aktiviert nicht alle Warnungen). – Nielsen int foo(){ return 0;} 21. Januar um 9:56 Uhr int foo(void){ return 0;}interjay, C11 § 6.7.6.3 14 hat “Eine Bezeichnerliste deklariert nur die Bezeichner der Parameter der Funktion. Eine leere Liste in einem Funktionsdeklarator, der Teil einer Definition dieser Funktion ist, gibt an, dass die Funktion keine Parameter hat.” widerspricht. Eine Funktion

    Definition

    als


  • sollte gleich sein -pedantic . Ich vermute, dass der verwendete Compiler dieser Spezifikation nicht folgt.

    – chux – Wiedereinsetzung von Monica

    21. Januar um 12:15 Uhr

  • @chux-ReinstateMonica Ich denke, du hast Recht und das sollte nicht kompilieren. Aber sowohl gcc als auch clang erlauben dies, sogar in

    Modus.

    – zwischenjay

1444220cookie-checkWarum hat ein `int

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy