mixte des déclarations et des codes
Quand je compile fonction avec "gcc -o dene -Wall-ansi -pedantic-erreurs de dénir.c"
gcc n'émet pas d'erreur.(pouvez-vous regarder une ligne qui commence avec le char ....,si la boucle,)
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]=' 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]);
}
';
strcat(s1,","); strcat(s1,p); free(p);
continue;
}
cmainp[0][d]=s[i];
++d;
} cmainp[0][d+1]=' 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]);
}
';
strcpy(cmainp[0],s);
free(cmainp[0]);
}
Mais,quand compiler fonction ci-dessus reformatée avec gcc
gcc émet que de l'erreur;
"dene.c:10: erreur: ISO C90 interdit mixte déclarations et le 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]=' 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]);
}
';
strcat(s1,","); strcat(s1,p); free(p);
continue;
}
cmainp[0][d]=s[i];
++d;
} cmainp[0][d+1]=' 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]);
}
';
strcpy(cmainp[0],s);
free(cmainp[0]);
}
Et dernier,gcc émet des erreurs suivantes
dénir.c:16: erreur: attendu expression avant de ‘char’
dénir.c:20: erreur: "p1" non déclaré (première utilisation dans cette fonction)
dénir.c:20: erreur: (Chaque identificateur non déclaré est signalé qu'une seule fois
dénir.c:20: erreur: pour chaque fonction, il paraît.)
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]=' 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]);
}
';
strcat(s1,","); strcat(s1,p); free(p);
continue;
}
cmainp[0][d]=s[i];
++d;
} cmainp[0][d+1]=' 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]);
}
';
strcpy(cmainp[0],s);
free(cmainp[0]);
}
question est de savoir pourquoi il y a des différences entre eux.
OriginalL'auteur | 2010-05-24
Vous devez vous connecter pour publier un commentaire.
En K&R et le c ANSI, vous devez toujours mettre des déclarations au début d'une portée de bloc. Cette exigence est détendue dans le c99.
Alors, quelle est la portée de bloc? Une région délimitée par
{
et}
.Donc à vous de l'exemple ci-dessus la déclaration
est OK, car il se produit immédiatement après un
{
, tandis queéchoue parce que la mission vient entre le
{
et la deuxième déclaration (int len=0;
).Vous pouvez, être conscient, cependant, que la variable créée dans une étendue aller hors de portée lorsque vous atteignez la correspondance
}
, et le fait d'accéder, après c'est une erreur.Ont été pré C89 compilateurs encore plus strictes? Je veux dire, il était exigé que les déclarations de commencer au début de chaque bloc de fonction ou chaque bloc? Je veux dire est -
foo() { int i; for(i=0; i<n; i++) { int j; for(j=0; j<n; j++) {}}}
juridique pré C89 compilateurs?Aucune idée. J'ai appris c après la norme ANSI sur les compilateurs qui étaient pour la plupart plainte avec elle. Je n'ai jamais écrit de K&R pour sourire et utilisé le mode de compatibilité de certains ANSI compilateur.
OriginalL'auteur dmckee
Le problèmes est que votre drapeau "ansi" impose les règles de la norme ANSI C, parmi lesquels se trouve que les déclarations peuvent apparaître qu'au début d'un bloc et pas n'importe où ailleurs entrelacé avec d'autres états.
Remarque que dans votre premier exemple, l'accolade d'ouverture
{
après le si commence un nouveau bloc, et par conséquent, il est légal de déclarer de nouvelles variables. Dans ton deuxième exemple, vous déclarez "int len" dans le même bloc que "char **cmainp", mais après une mission de "cmainp". Si vous placez l'affectation après la déclaration, alors tout ira bien, depuis la déclaration serait alors au début d'un bloc.OriginalL'auteur Michael Aaron Safyan
Avec le "dene.c:10: erreur: ISO C90 interdit mixte déclarations et le code d'erreur" vous définissez
char *p=malloc(sizeof(char)*3)
dans le milieu du code. ANSI C exige que la déclaration apparaissent seulement au début du bloc de code et nulle part ailleurs. Si au contraire vous mettre char*p
au début du code, puis*p=malloc(sizeof(char)*3)
sur la ligne 10, cette "erreur" ne disparaisse.OriginalL'auteur shuttle87
que vous avez à faire les déclarations avant de faire quoi que ce soit.
OriginalL'auteur