C中标头中定义结构的main中的语句错误

C中标头中定义结构的main中的语句错误,c,struct,header-files,C,Struct,Header Files,我是二年级(学习阶段)。我们现在学习结构,我决定尝试使用标题。但他们似乎不想工作,太懒或是什么的:D 问题是头文件init.h中定义的“Vector”结构包含在main.c中,以供将来使用。本以为一切都很酷,但发生了错误!该死,它高亮显示Vector*vStart行(错误行)。在对这个错误进行了一些研究之后,我发现这是一个非常普遍的错误,发生在与结构或标题相关的情况下 错误代码: 标签只能是语句的一部分,而声明不是 声明 例如: 初始h main.c 将开关外壳更改为 case Start

我是二年级(学习阶段)。我们现在学习结构,我决定尝试使用标题。但他们似乎不想工作,太懒或是什么的:D

问题是头文件init.h中定义的“Vector”结构包含在main.c中,以供将来使用。本以为一切都很酷,但发生了错误!该死,它高亮显示
Vector*vStart行(错误行)。在对这个错误进行了一些研究之后,我发现这是一个非常普遍的错误,发生在与结构或标题相关的情况下

错误代码: 标签只能是语句的一部分,而声明不是 声明

例如:

初始h

main.c


开关
外壳
更改为

   case Start:
   {
       Vector* vStart;
       if(vectorInit(vStart))
       {
          getStartPoint(vStart);
          vectorPrint(vStart);
       }
       else
       {
           hFe("Vector vStart is not created!");
           return 1;
       }

       getch();
    }
    break;
通过这种方式,使用括号,您可以在案例中创建一个范围,在其中可以声明变量。
顺便说一句,您应该在函数顶部声明它,以生成可读的代码。

假设您使用的是有点现代的C编译器,错误与当前答案所建议的范围无关

正如编译器所说:“错误:标签只能是语句的一部分,而声明不是语句”。错误仅仅来自不正确的标签语法<代码>大小写
遵循标签的语法规则,语法必须如下(6.8.1):

这意味着标签后面必须跟一条语句,而不是声明或其他在C中不被视为语句的东西。因此,如果尝试像
goto-label这样的操作,您会得到与您相同的编译器错误;标签:INTX

避免编译器错误的一种方法是添加一个空语句:

case Start:
  ;
  Vector* vStart;
尽管如此,您可能仍然希望通过添加大括号为每种情况指定一个局部范围:这样做是一种良好的做法


然而,从更大的角度来看,在本地范围内声明
vStart
似乎没有任何意义。您应该在main的开头声明它,并将其初始化为安全值,例如NULL。

标签必须位于单独的行上,通常从该行的第一列开始,并且该行上没有其他内容。即

mylabel:

错误在哪里,在哪一行?标签
又在哪里
?另外,在使用标签时也会出现这种情况,
goto
也可以。使用它而不是循环(我猜您正在这样做)不是。您的
main()
的返回类型是什么?您正在使用哪个编译器。正如@JoachimPileborg所说,这正是为什么有些人如此讨厌
goto
。@RandomNoob既然你在学习,就尝试一些不会强迫你使用丑陋的和操作系统相关的工具,比如
system(“cls”)
getch()
。它们不是标准的。例如,
系统(“cls”)
仅在Windows操作系统上可用。而且
getch()
太危险了。如果必须使用
getch()
,那是因为程序退出时控制台窗口关闭。您可以学习如何在您可以控制一切的linux系统上工作。但是,错误与作用域无关,而是与标记语法有关。@RandomNoob,同样,没有亵渎。汇编语言中必需的东西,如跳转和分支语句,在C语言中是不可取的。相反,使用循环语句,如
while()
for()
do…while()
一般来说,
goto
语句会导致
spaghetti
代码,使代码难以理解,并且(正如您所发现的)可能是调试的真正噩梦
labeled-statement:
  identifier : statement
  case constant-expression : statement
  default : statement
case Start:
  ;
  Vector* vStart;
mylabel: