C 混合声明和代码
当我用“gcc-o dene-Wall-ansi-pedantic errors dene.c”编译函数时 ,gcc不会发出错误。(您能在if循环中查找以char…开头的行吗?)C 混合声明和代码,c,declaration,compiler-warnings,c89,C,Declaration,Compiler Warnings,C89,当我用“gcc-o dene-Wall-ansi-pedantic errors dene.c”编译函数时 ,gcc不会发出错误。(您能在if循环中查找以char…开头的行吗?) static void remove_否定(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); 对于K&
static void remove_否定(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);
对于K&R和ANSI c中的(i=0;i),必须始终将声明放在范围块的开头。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;
)之间,因此失败。问题在于您的标志“-ansi”强加了ansi C的规则,其中之一是声明可能只出现在块的开头,而不会出现在与其他语句交错的任何地方
请注意,在第一个示例中,if后面的大括号{
开始一个新块,因此在该块中声明新变量是合法的。在第二个示例中,在同一块中声明“int len”为“char**cmainp”,但在赋值为“cmainp”之后。如果您将赋值放在声明之后,那么一切都会很好,因为声明将位于块的开头。带有“dene.c:10:error:ISO C90禁止混合声明和代码”错误,您定义的错误char*p=malloc(sizeof(char)*3)在代码中间,ANSI C要求声明只出现在代码块的起始处,而不在其他地方。如果在代码开始时放置char <代码> *P<代码>,然后在代码10中输入代码> *p= Malc(sichOf(char)* 3)< /代码>这个“错误”。在你做任何事情之前,你必须先做声明。我可以这样说吗;{if(s[I]='-')if(I==0 | | s[I-1]==','){char*p=malloc(sizeof(char)*3),在第二个示例中,仅当两个if语句满足时,才会创建char*p..。但是,请注意,当到达匹配的}时,在作用域中创建的变量将超出作用域
,然后再访问它们是一个错误。C89之前的编译器更严格吗?我的意思是要求声明从每个函数块或每个块的开头开始吗?我的意思是foo(){int I;for(i=0;i@Zboson不知道。我是在ANSI标准的编译器上学习c语言的,这些编译器对c语言最为不满。我只为grins编写过K&R,并使用了一些ANSI编译器的兼容模式。
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]);
}
{
char *p=malloc(sizeof(char)*3); /* ...
{
char **cmainp=malloc(sizeof(char*)*1);
/*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/
int len=0;...