9

「gcc-odene-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:エラー:ISOC90は宣言とコードの混合を禁止しています」

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

そして最後の1つ、gccは次のエラーを発行します

dene.c:16:エラー:「char」の前に式が必要です</ p>

dene.c:20:エラー:'p1'が宣言されていません(この関数での最初の使用)

dene.c:20:エラー:(宣言されていない各識別子は1回だけ報告されます

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

4 に答える 4

14

K&RおよびANSI cでは、常にスコープブロックの先頭に宣言を配置する必要があります。この要件はc99で緩和されています。

では、スコープブロックとは何ですか?{とで区切られた領域}

したがって、上記の例では、宣言

{
   char *p=malloc(sizeof(char)*3); /* ...

直後に発生するのでOKです{

{
  char **cmainp=malloc(sizeof(char*)*1);    

  /*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/

  int len=0;...

{割り当てがと2番目の宣言()の間にあるため、失敗しますint len=0;

于 2010-05-24T10:23:26.380 に答える
1

問題は、フラグ「-ansi」が ANSI C の規則を課していることです。その中で、宣言はブロックの先頭にのみ表示され、他のステートメントとインターリーブされた場所には表示されません。

{最初の例では、 if の後の左中括弧が新しいブロックを開始するため、そこで新しい変数を宣言することは合法であることに注意してください。2 番目の例では、「int len」を「char **cmainp」と同じブロックで宣言しますが、「cmainp」への割り当ての後に宣言します。宣言の後に代入を配置すると、宣言がブロックの先頭になるため、すべて問題ありません。

于 2010-05-24T10:24:32.377 に答える
1

「dene.c:10: エラー: ISO C90 は、宣言とコードの混合を禁止しています」というエラーをコードchar *p=malloc(sizeof(char)*3)の途中で定義しています。ANSI C では、宣言がコード ブロックの先頭にのみ表示され、それ以外の場所には表示されないようにする必要があります。*p代わりに、コードの先頭にchar を配置し、 *p=malloc(sizeof(char)*3)10 行目にすると、この「エラー」は解消されます。

于 2010-05-24T10:25:08.693 に答える
0

you have to do the declarations before you do anything.

于 2012-08-23T13:41:24.337 に答える