Wie zu beheben "conflicting types Fehler" in C?
Für die folgenden C-code (für das austauschen von zwei zahlen) bin ich immer die "Konflikt-Typen" Fehler für swap
Funktion:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b;
printf("enter the numbers to be swapped");
scanf("%d%d",&a,&b);
printf("before swap");
printf("a=%d,b=%d",a,b);
swap(&a,&b,sizeof(int));
printf("after swap");
printf("a=%d,b=%d",a,b);
getch();
}
void swap(void *p1,void *p2,int size)
{
char buffer[size];
memcpy(buffer,p1,size);
memcpy(p1,p2,size);
memcpy(p2,buffer,size);
return(0);
}
Compiler Diagnose:
<source>:10:6: warning: implicit declaration of function 'swap' [-Wimplicit-function-declaration]
swap(&a,&b,sizeof(int));
^~~~
program:15:6: warning: conflicting types for 'swap'
void swap(void *p1,void *p2,int size)
^~~~
Kann jemand sagen warum dieser Fehler kommt?
Was ist die Lösung dafür?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
swap
wurde nicht erklärt, bevor es verwendet wird. So erhält er eine "Standard-Unterschrift", wird in diesem Fall nicht mit seiner eigentlichen Unterschrift. Zitat Andrey T:Abgesehen davon, dass dein code erzeugt eine Reihe von anderen Warnungen. Wenn Sie mit
gcc
kompilieren mit-Wall -pedantic
(oder sogar mit-Wextra
), und sicher sein, befestigen Sie jeden Warnmeldung, bevor Sie fortfahren, um das Programm zusätzliche Funktionen. Vielleicht möchten Sie auch zu sagen, der compiler, ob Sie schreiben ANSI-C (-ansi
) oder C99 (-std=c99
).Einige Bemerkungen:
main
Gegenzug eineint
.return 0
oderreturn EXIT_SUCCESS
.getch
:#include <curses.h>
.getchar
.memcpy
:#include <string.h>
.void
Funktion.Den Sie verwenden möchten, können
malloc
zum reservieren eines Puffers variabler Größe. Das funktioniert auch mit älteren Compilern:<curses.h>
es sei denn, Sie sind auch vorbereitet zum initialisieren der Bibliothek (oder in Aufmachungen mit core-dumps, wenn Sie nicht).Müssen Sie erklären tauschen, bevor es zu benutzen. Zum Beispiel, setzen
swap
oben, main, oder fügen Sie einen Prototyp fürswap
wie diese:Übrigens
main
sollteint
nichtvoid
und in der Regel gibt es den Wert null, es sei denn, es ist ein Fehler.First off, ist die eigentliche Fehlermeldung würde nicht Schaden.
Zweitens, was buffer [size] funktioniert nur auf manchen Compiler (das ist ein neues feature, nicht alle Compiler haben es noch). Bist du sicher, dass deins nicht?
Drittens müssen Sie erklären tauschen, bevor Sie ihn aufrufen. Fügen Sie einen Prototyp an den Anfang der Datei:
Konnte Sie nicht erklären
swap
ausdrücklich, zwingt den compiler, um Annahmen über die Funktion an der Stelle des Aufrufs. Der compiler, in übereinstimmung mit den C-Regeln wird davon ausgegangen, dassswap
istSpäter erklären Sie Ihre swap
die offensichtlich Verschieden von dem, was der compiler angenommen. Dies ist der Konflikt, den der compiler dir erzählt.
Auch, Ihre
void swap
versuchtreturn 0
. Was wollten Sie damit erreichen?P. S. Es ist
int main
, nichtvoid main
.P. P. S. Das Programm ist nicht garantiert, erzeugen keine Ausgabe, wenn seine Ausgabe nicht Ende in ein neue-Zeile-Zeichen.
Kann man sich Fragen, warum das Programm kompiliert, ohne einen Prototyp für swap(), und das ist, weil der compiler ist mehr als ein C99-tool. Es kompiliert auch C89 und K&R C-Programme.
C89 Hinzugefügt die Prototypen. Vor C89, der compiler nicht brauchen, um zu sehen, die Deklaration (Prototyp) einer Funktion es sei denn, es kehrte etwas anderes als
int
und die Typen der formalen Parameter nicht bekannt waren, die für den compiler überhaupt. Der compiler einfach aufgerufen, jede Funktion mit die Typen der tatsächlichen Argumente, die Sie erhalten eine Reihe von Standard-argument-Aktionen, um die Dinge zu vereinfachen. Der Programmierer würde dielint
Dienstprogramm zur überprüfung der tatsächlichen und formalen Parameter. Dieses Programm ist noch im Lieferumfang der BSD-Distributionen.K&R Programme und die entsprechenden code-styles sind immer noch akzeptiert, die von Ihrem compiler, so dass, wenn es sieht, eine Funktion, für die keine Prototypen gibt es nur voran geht und fordert es trotzdem.
In diesem Fall, schalten Sie Paradigmen in der zwischen dem Aufruf und der definition der Funktion. Die K&R-C Annahmen, die der compiler über das nicht deklarierte Funktion, wenn es um die generieren ein Anruf stellte sich heraus, nicht, um gültig zu sein. Selbst wenn du geschrieben hättest das ganze Programm in der K&R Stil, der compiler hätte die gleichen Beschwerden, wenn Sie erfahren, dass die real Typen der Funktionsargumente.
Mit GCC, das ist eine Warnung,
wenn Sie nicht deklarieren eine Funktion vor der Verwendung der compiler versucht zu erraten, die Deklaration über die Art des Aufrufs der Funktion.Daher das Verhalten.
Gut, es kompiliert auf http://codepad.org (nach dem entfernen der
getch()
, welche ist irrelevant). Vielleicht hat dein compiler beschwert sich über die Verwendung von memcpy, die auf nicht-eingeschränkte Hinweise?In
swap()
p1
undp2
sind nicht garantiert keine Aliase. Dies ist wirklich ein bug warten, um zu geschehen - Aufruf von swap auf&a[i]
und&a[j]
könnte blow upmemcpy
wenni==j
. Entwedermemmove
(die garantiert nicht zu sprengen, auf überlappende Bereiche) oder deklarieren Sie den Zeigerrestricted
.swap
kompiliert, weil offiziell ist es nicht ein Fehler in C. Es ist UB. Aber wie Sie es geschafft zu kompilierenreturn 0
imvoid
Funktion ist mir nicht klar.