C 中来自 header 的定义结构主体中的语句错误

Statement error in main of defined structure from header in C

我大二(学习阶段T_T)。我们现在学习结构,我决定尝试 headers。但是他们好像不想工作,太懒了什么的:D

问题是 header 文件 init.h 中定义的 'Vector' 结构是 包含main.c中以供进一步使用。以为一切都很酷,但发生了错误!该死的,它突出显示了 Vector* vStart; 行(错误行)。好吧,在对该错误进行一些研究之后,我发现它是在结构或 header 相关案例中发生的非常普遍的错误。

Error code: a label can only be part of a statement and a declaration is not a statement

示例:

init.h

#ifndef INIT_H
#define INIT_H
#define vecLength 4

typedef struct Vector {
double * vector;
int N;
} Vector;

typedef struct Matrix {
double ** matrix;
int nRow;
int nCol;
} Matrix;

int matrixInit(Matrix* nMatrix);
int vectorInit(Vector* nVector);

#endif // INIT_H

main.c

    #include "init.h"

  main(){ 
    ...
    ...
    switch(_char)
    {
    case Start:
        Vector* vStart;
        if(vectorInit(vStart)){
            getStartPoint(vStart);
            vectorPrint(vStart);
        }

        else{
            hFe("Vector vStart is not created!");
            return 1;
        }

        getch();
        break;

    case Translation:
        hFe(NULL);
        return 1;

    case Exit:
        return 0;

    default:
        system("cls");
        goto AGAIN;
    }
  }

将您的 switch case 更改为

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

       getch();
    }
    break;

这样,通过括号,您可以在可以声明变量的情况下创建范围。 顺便说一句,您应该在函数的顶部声明它以生成可读代码。

假设您使用的是比较现代的 C 编译器,那么该错误与当前答案所暗示的范围完全无关。

就像编译器说的那样:"error: a label can only be part of a statement and a declaration is not a statement"。该错误仅来自不正确的标签语法。 case 遵循标签的语法规则,语法必须像这样(6.8.1):

labeled-statement:
  identifier : statement
  case constant-expression : statement
  default : statement

意味着标签后面必须跟一个语句,而不是声明或其他在 C 中不被视为语句的东西。所以你得到的编译器错误与尝试类似 goto label; label: int x;

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

case Start:
  ;
  Vector* vStart;

话虽这么说,但您可能仍希望通过添加大括号为每个案例指定一个局部作用域:这样做是一种很好的做法。

然而,纵观全局,在局部范围内声明 vStart 似乎没有任何意义。应该在main的开头声明,并初始化为一个安全的值,比如NULL。

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

mylabel: