Когда я компилирую функцию с "gcc-o долина - Стена-ansi - педантичные ошибки dene.c", gcc не испускает ошибки. (можно ли посмотреть строка, которая запускается с символа...., в если цикл),
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]);
}
Но, когда компиляция выше функции, переформатированной с gcc, gcc, испускает ту ошибку;
"долина c:10: ошибка: ISO C90 запрещает смешанные объявления и код"
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]);
}
И продержитесь один, gcc испускает следующие ошибки
долина c:16: ошибка: ожидаемое выражение перед 'символом'
долина c:20: ошибка: необъявленный ‘p1’ (сначала используют в этой функции),
долина c:20: ошибка: (О каждом необъявленном идентификаторе сообщают только однажды
долина c:20: ошибка: для каждой функции это появляется в.)
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]);
}
вопрос состоит в том, почему существуют различия между ними.
В K&R и ANSI c вы всегда должны помещать объявления в начало блока области видимости. Это требование смягчено в c99.
Итак, что такое блок прицела? Область, ограниченная {
и }
.
Итак, в приведенном выше примере объявление
{
char *p=malloc(sizeof(char)*3); /* ...
в порядке, потому что оно происходит сразу после {
, а
{
char **cmainp=malloc(sizeof(char*)*1);
/*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/
int len=0;...
терпит неудачу, потому что присвоение происходит между {
и вторым объявление ( int len = 0;
).
Проблема в том, что ваш флаг "-ansi" налагает правила ANSI C, среди которых есть то, что объявления могут появляться только в начале блока и нигде не чередуются с другими операторами.
Обратите внимание, что в вашем первом примере открывающая скобка {
после if начинает новый блок, и, следовательно, там можно объявлять новые переменные. Во втором примере вы объявляете «int len» в том же блоке, что и «char ** cmainp», но после присвоения «cmainp». Если вы разместите присвоение после объявления, тогда все будет хорошо, поскольку объявление тогда будет в начале блока.
С ошибкой «dene.c: 10: error: ISO C90 запрещает смешанные объявления и код» вы определяете char * p = malloc (sizeof (char) * 3)
в середине кода. ANSI C требует, чтобы объявление появлялось только в начале блока кода и больше нигде. Если вместо этого вы поместите char * p
в начало кода, а затем * p = malloc (sizeof (char) * 3)
в строке 10, эта «ошибка» исчезнет.