混合声明和代码

时间:2010-05-24 10:17:21

标签: c declaration compiler-warnings c89

当我使用“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:错误: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'未声明(首次使用此功能)

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 个答案:

答案 0 :(得分:14)

在K&amp; 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 :(得分:1)

问题是你的标志“-ansi”强加了ANSI C的规则,其中声明可能只出现在块的开头,而不是与其他语句交错的任何地方。

请注意,在第一个示例中,if之后的左括号{开始一个新块,因此在那里声明新变量是合法的。在第二个示例中,您在与“char ** cmainp”相同的块中声明“int len”,但在分配给“cmainp”之后。如果你在声明之后放置作业,那么一切都会好的,因为声明将在一个块的开头。

答案 2 :(得分:1)

使用“dene.c:10:错误:ISO C90禁止混合声明和代码”错误,您在代码中间定义了char *p=malloc(sizeof(char)*3)。 ANSI C要求声明在代码块的开头只显示 ,而不是其他地方。如果您将char *p放在代码的开头,然后在第10行放置*p=malloc(sizeof(char)*3),则此“错误”将消失。

答案 3 :(得分:0)

你必须在做任何事之前做声明。