gemischte Deklarationen und codes
Wenn ich die Funktion kompilieren mit "gcc -o dene -Wall -ansi -pedantic-errors denieren.c"
der gcc gibt keine Fehler.(kann man sich eine Linie, die beginnt mit char ....,in der if-Schleife)
static void remove_negation(char *s,char *s1)
{
char **cmainp=malloc(sizeof(char*)*1);
int len=0;int d=0; int i=0;
cmainp[0]=malloc(sizeof(char)*300);
len=strlen(s);
for(i=0;i<len;++i)
{ if(s[i]=='-')
if(i==0 || s[i-1]==',')
/*look*/ {char *p=malloc(sizeof(char)*3); /*look*/
++i; p[0]=s[i]; p[1]='\0';
strcat(s1,","); strcat(s1,p); free(p);
continue;
}
cmainp[0][d]=s[i];
++d;
} cmainp[0][d+1]='\0';
strcpy(cmainp[0],s);
free(cmainp[0]);
}
Aber beim kompilieren über die Funktion neu formatiert mit gcc
gcc aussendet, dass Fehler;
"denieren.c:10: Fehler: ISO-C90 verbietet gemischte Deklarationen und code"
static void remove_negation(char *s,char *s1)
{
char **cmainp=malloc(sizeof(char*)*1);
/*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/
int len=0;int d=0; int i=0;
len=strlen(s);
for(i=0;i<len;++i)
{ if(s[i]=='-')
if(i==0 || s[i-1]==',')
{char *p=malloc(sizeof(char)*3);
++i; p[0]=s[i]; p[1]='\0';
strcat(s1,","); strcat(s1,p); free(p);
continue;
}
cmainp[0][d]=s[i];
++d;
} cmainp[0][d+1]='\0';
strcpy(cmainp[0],s);
free(cmainp[0]);
}
Und das Letzte,gcc emittiert folgenden Fehler
denieren.c:16: Fehler: expected expression before 'char'
denieren.c:20: Fehler: "p1" schwarzarbeit (erste Benutzung in dieser Funktion)
denieren.c:20: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal berichtet
denieren.c:20: Fehler: für jede Funktion erscheint in.)
static void remove_negation(char *s,char *s1)
{
char **cmainp=malloc(sizeof(char*)*1);
int len=0;int d=0; int i=0;
cmainp[0]=malloc(sizeof(char)*300);
len=strlen(s);
for(i=0;i<len;++i)
{ if(s[i]=='-')
/*look*/ char *p=malloc(sizeof(char)*3); /*look*/
if(i==0 || s[i-1]==',')
{
++i; p[0]=s[i]; p[1]='\0';
strcat(s1,","); strcat(s1,p); free(p);
continue;
}
cmainp[0][d]=s[i];
++d;
} cmainp[0][d+1]='\0';
strcpy(cmainp[0],s);
free(cmainp[0]);
}
Frage ist, warum gibt es Unterschiede zwischen Ihnen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In K&R und ANSI c, müssen Sie immer setzen-Deklarationen am Anfang von einem scope-block. Diese Anforderung entspannt in c99.
Also, was ist ein scope-block? Eine region begrenzt durch
{
und}
.So in Sie obigen Beispiel die Erklärung
ist in Ordnung, denn es geschieht unmittelbar nach einer
{
, währendfehl, weil die Zuweisung kommt zwischen den
{
und die zweite Deklaration (int len=0;
).}
, und den Zugriff auf Sie nach dass ist ein Fehler.foo() { int i; for(i=0; i<n; i++) { int j; for(j=0; j<n; j++) {}}}
rechtlichen vor C89 Compiler?Der Probleme ist, dass Sie Ihre fahne "-ansi" auferlegt, die den Regeln der ANSI-C, von denen, die Erklärungen erscheinen mag, die nur am Anfang eines Blocks und nicht irgendwo anders "interleaved" mit anderen Aussagen.
Beachten Sie, dass in Ihrem ersten Beispiel, wird die öffnende Klammer
{
nach der wenn beginnt ein neuer block, und daher ist es legal, deklarieren von neuen Variablen gibt. In Ihrem zweiten Beispiel, erklären Sie, "int len" in dem gleichen block wie "char **cmainp", aber nach einer Zuordnung zu "cmainp". Wenn Sie die Zuordnung nach der Erklärung, dann wird alles in Ordnung sein, da die Erklärung wäre dann am Anfang eines Blocks.Mit der "denieren.c:10: Fehler: ISO-C90 verbietet gemischte Deklarationen und code" - Fehler, den Sie definieren
char *p=malloc(sizeof(char)*3)
in der Mitte des Codes. ANSI-C verlangt, dass die Deklaration erscheinen nur am Anfang der code-block, und nirgendwo sonst. Wenn Sie stattdessen setzen char*p
am Anfang des Codes und dann*p=malloc(sizeof(char)*3)
in Zeile 10 dieser "Fehler" wäre Weg.müssen Sie die Erklärungen, bevor Sie etwas tun.