смешанные объявления и коды - PullRequest
9 голосов
/ 24 мая 2010

Когда я компилирую функцию с помощью "gcc -o dene -Wall -ansi -pedantic-errors dene.c", gcc не выдает ошибки (вы можете посмотреть строку, которая начинается с char ...., в цикле if,)

        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 выдает эту ошибку;

"dene.c: 10: error: 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 выдает следующие ошибки

dene.c: 16: ошибка: ожидаемое выражение перед 'char'

dene.c: 20: ошибка:'p1' undeclared (первое использование в этой функции)

dene.c: 20: ошибка: (каждый необъявленный идентификатор сообщается только один раз

dene.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]);
              }

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

Ответы [ 4 ]

14 голосов
/ 24 мая 2010

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

1 голос
/ 24 мая 2010

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

1 голос
/ 24 мая 2010

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

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

0 голосов
/ 23 августа 2012

Вы должны сделать декларации, прежде чем что-либо делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...