C错误:原型函数声明不在范围内

时间:2011-06-29 14:15:05

标签: c compiler-errors

我不明白我的错误是什么:

 void main(char string[])
 {
   strcpy(command_E,string);
   processCMD(); /*FIRST ERROR:  prototype function declaration not in scope */
 }

 void processCMD(void) /*SECOND ERROR: external item attribute mismatch */
 {
  .... /*rest of code not displayed*/

2 个答案:

答案 0 :(得分:4)

在您使用 processCMD()时,您尚未为其声明原型,因此它会获得默认值。

您尚未声明它会导致第一个错误。

您的实际定义与创建的默认定义冲突,因为您没有声明它是导致第二次错误的原因。

解决方案是在使用前定义函数:

void processCMD(void) {
    blah blah blah
}

void main (char string[]) {  // not really a good definition for main, by the way.
    strcpy(command_E,string);
    processCMD();
}

或在使用前提供原型:

void processCMD(void);

void main (char string[]) {  // not really a good definition for main, by the way.
    strcpy(command_E,string);
    processCMD();
}

void processCMD(void) {
    blah blah blah
}

关于main的声明,两种规范形式是:

int main (void);
int main (int argc, char *argv[]); // or char **argv.

标准允许其他人(实现定义),但这两者是必需的(至少对于托管实现 - 像嵌入式系统或操作系统这样的独立实现可以很好地做任何他们想做的事情。)

答案 1 :(得分:1)

在第一次使用函数之前需要一个原型来声明它,以便编译器知道函数采用什么类型的参数(如果有的话)以及它返回的内容:

void processCMD(void); // prototype

void main(char string[])
 {
   strcpy(command_E,string);
   processCMD();
 }

 void processCMD(void)
 {
  .... /*rest of code not displayes*/

或者,您可以在首次使用之前定义该函数(因为该定义将提供编译器所需的信息。

通常,原型将进入头文件,因此其他模块可以使用该函数,因为函数定义只能在一个源文件中(除非使函数静态,这使得函数的每个实例'私有'到模块,或将函数标记为内联,这样可以实现多个定义。)

一些额外的原型琐事:

  • 通常在C语言中,缺少原型本身并不是错误 - 如果编译器在没有看到原型的情况下看到函数调用,它将假定您传递了正确的参数,它将应用'默认促销'到参数(基本上将事物转换为int ot double),并假设函数返回int。如果这些假设是错误的,那么程序是不正确的,并且将具有未定义的行为。编译器通常可以配置为发出警告或错误,以调用没有原型的函数(显然是你的原型)。在C ++中,调用没有看到先前原型的函数(或完整的函数定义)总是错误的。

  • 在C中,有以下区别:

    void processCMD();
    

    void processCMD(void);
    

    第一个是函数声明,但不是原型 - 它告诉编译器processCMD是一个函数,它返回void而不是int。但它并没有告诉编译器有关参数的任何信息。编译器仍然允许通过传递的参数进行函数调用,并将应用默认促销。 (同样,编译器配置可能会禁用此功能。)

    第二个是一个原型,专门告诉编译器该函数不带参数。

    在C ++中,两者都是等价的,并且具体告诉编译器该函数不带参数。

相关问题