混合声明和代码

当我使用“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]); } 

问题是为什么它们之间存在差异。

在K&R和ANSI c中,必须始终将声明放在作用域块的开头。 这个要求在c99中放宽了。

那么,范围块是什么? 由{}分隔的区域。

所以在上面的例子中声明

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

没关系,因为它发生在{ ,while之后

 { char **cmainp=malloc(sizeof(char*)*1); /*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/ int len=0;... 

失败,因为分配介于{和第二个声明( int len=0; )之间。

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

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

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

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