类型转换失败 我试图把一个程序从C转换成C++。限定条件是它通过g++编译

类型转换失败 我试图把一个程序从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

我得到这个错误:

错误:使用未声明的标识符“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->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[] = {

};
在使用此标识符之前


这些语言有“提前声明”的概念。这样的声明说name
Blah
是结构或枚举,但没有给出任何进一步的细节。但至少这应该存在。否则就是语法错误。在您的示例中,关于
命令

没有任何内容,您必须在使用它之前声明一个标识符。在这里,您在尝试使用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[];