类型转换失败 我试图把一个程序从C转换成C++。限定条件是它通过g++编译
我得到这个错误: 错误:使用未声明的标识符“mscp_命令” c=mscp_命令 我认为这与函数不能“看到”struct命令有关。有人能帮忙吗?走开类型转换失败 我试图把一个程序从C转换成C++。限定条件是它通过g++编译,c++,c,C++,C,我得到这个错误: 错误:使用未声明的标识符“mscp_命令” c=mscp_命令 我认为这与函数不能“看到”struct命令有关。有人能帮忙吗?走开 static void cmd_help(char *dummy) { struct command *c; puts("commands are:"); c = mscp_commands; do { printf("%-8s - %s\n", c->name ? c->n
static void cmd_help(char *dummy)
{
struct command *c;
puts("commands are:");
c = mscp_commands;
do {
printf("%-8s - %s\n", c->name ? c->name : "", c->help);
} while (c++->name != NULL);
}
struct command mscp_commands[] = {
....
};
在代码> CMDIAsvs//COD>函数.< /P>
C和C++之前,所有的东西都应该在使用之前声明或定义。当编译器在
c=mscp\u命令中找到它以前从未见过的标识符时,比如您的mscp\u命令
代码>它发出一个错误。您需要向上移动mscp_命令的定义,或者至少像这样声明它
struct command mscp_commands[] = {
};
在使用此标识符之前
这些语言有“提前声明”的概念。这样的声明说nameBlah
是结构或枚举,但没有给出任何进一步的细节。但至少这应该存在。否则就是语法错误。在您的示例中,关于命令
没有任何内容,您必须在使用它之前声明一个标识符。在这里,您在尝试使用mscp_命令后,正在声明它。可能的重复没有“前向声明”这样的概念。唯一的概念是声明和定义。另外,您声明的“绝对没有期望”规则也有例外:声明extern inti代码>足以使用i
。使用前不需要提供i
的定义。当使用指针或对仅声明但尚未定义的类型的引用时,也存在类似的异常。您错了。有“远期申报”这样的概念。谷歌搜索它,你会得到很多结果。例如,看看。我刚刚检查了C++11标准。它多次提到这个概念,例如在246368页。考虑修改或删除你的评论。我想说的是,在使用某物的时候,编译器应该对这件事了如指掌。您的示例使用extern int i
有点令人困惑,因为它在语法上是一个声明,但它告诉了关于对象的一切。完整的定义不会带来更多细节。我的观点是,标准中的术语并不完美,这是混乱的核心根源。我将重新设计我的答案。C++标准在类声明和前向声明之间没有区别。后者用词不当,没有引入新概念。如果您可以提供一个不是声明或重新声明的转发声明,我将删除我以前的评论。@IInspectable它不是吗?ISO C++标准不仅使用“正向声明”一词,第27.3节实际上是“27.3个正向声明[IOSROUND.FAND]”。在“C”中,术语通常是“原型”,但在C++中,它指的是必须声明一个声明,它不是向前引用的目的。例如struct A;结构B{A*A;};结构A{struct B*B;}代码>
extern struct command mscp_commands[];