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:
我大二(学习阶段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: