смешанные объявления и коды

Когда я компилирую функцию с "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]);
              }

вопрос состоит в том, почему существуют различия между ними.

9
задан 24 May 2010 в 10:20
поделиться

3 ответа

В 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; ).

14
ответ дан 4 December 2019 в 13:00
поделиться

Проблема в том, что ваш флаг "-ansi" налагает правила ANSI C, среди которых есть то, что объявления могут появляться только в начале блока и нигде не чередуются с другими операторами.

Обратите внимание, что в вашем первом примере открывающая скобка { после if начинает новый блок, и, следовательно, там можно объявлять новые переменные. Во втором примере вы объявляете «int len» в том же блоке, что и «char ** cmainp», но после присвоения «cmainp». Если вы разместите присвоение после объявления, тогда все будет хорошо, поскольку объявление тогда будет в начале блока.

1
ответ дан 4 December 2019 в 13:00
поделиться

С ошибкой «dene.c: 10: error: ISO C90 запрещает смешанные объявления и код» вы определяете char * p = malloc (sizeof (char) * 3) в середине кода. ANSI C требует, чтобы объявление появлялось только в начале блока кода и больше нигде. Если вместо этого вы поместите char * p в начало кода, а затем * p = malloc (sizeof (char) * 3) в строке 10, эта «ошибка» исчезнет.

1
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: