'system' was not declared in this scope 错误
'system' was not declared in this scope error
所以我在其他程序中没有遇到这个错误,但我在这个程序中遇到了。
这个程序是一个我没有得到错误的例子。
#include<stdio.h>
int main() {
system("pause");
} // end main
但是在下面这个程序中我得到了错误
#include <stdio.h>
//#include <stdlib.h>
// Takes the number from function1, calculates the result and returns recursively.
int topla (int n) {
if(n == 1)
return 3;
else
return topla(n-1) + topla(n-1) + topla(n-1);
}
// Takes a number from main and calls function topla to find out what is 3 to the
// power of n
int function1(int n) {
return topla(n);
}
int main() {
int n; // We us this to calculate 3 to the power of n
printf("Enter a number n to find what 3 to the power n is: ");
scanf("%d", &n);
function1(n);
system("pause");
} // end main
只需包含 stdlib.h
,但不要使用 system("pause")
,因为它不是标准的并且不会在每个系统上工作,只是一个简单的 getchar()
( 或一个涉及 getchar()
的循环,因为你已经使用了 scanf()
) 应该可以解决问题。
并且通常 system("pause")
可以在 windows 命令行程序中找到,因为 windows 命令提示符会在程序退出时关闭,所以可能 运行 来自命令提示符的程序直接会有所帮助,或者使用 IDE 来解决这个问题,例如 geany.
如果 scanf()
最后始终检查 return 值,而不是假设它有效。
注:此代码
return topla(n - 1) + topla(n - 1) + topla(n - 1)
你可以写成
return 3 * topla(n - 1);
而不是递归调用 topla()
3 次。
而且你并不真正需要 else
因为函数 returns 除非 n != 1
所以即使没有 else
递归也会在 n == 1
.
在这里你需要了解两件事。
首先,您的代码运行良好,程序确实找到了 3^n 的值。所以不用担心。
来到 system() 部分,
为了使用 system();
函数,您需要包含 stdlib.h header 文件,因为该函数在 header 中声明。
因此,最好包含 header(而不是对其进行评论)。
现在,在windows中使用了pause关键字来阻止控制台在程序完成后关闭,它只适用于windows。
请注意,system("pause");
也不是标准,它不适用于其他机器,即 linux,因为使用系统命令,您直接与命令行交互。在这方面,每个操作系统的命令都是特定的,不能用于其他OS.
所以最好使用 getchar();
,一个 C 标准库函数,来控制控制台 window.
system
函数在标准 header <stdlib.h>
中声明。如果您的程序调用 system()
,您 必须 有
#include <stdlib.h>
在源文件的顶部或附近。
但是您的部分问题是:为什么在您省略 #include
指令时编译器没有报错?
1990 年的 C 标准(有时称为 "ANSI C")允许调用未明确声明的函数。如果你写,例如:
system("pause");
没有可见的 system
函数声明,假设 system
是用 int
的 return 类型声明的,并且参数与中的参数匹配调用——在本例中,是 char*
类型的单个参数。这恰好与 system
的实际声明一致,因此对于 C90 编译器,您可以省略 #include
指令。一些支持 1999 年和 2011 年最新标准(不允许隐式声明)的 C 编译器仍然允许旧形式,可能带有警告,以便向后兼容。
即使给定一个 C90 编译器,依赖现已过时的 "implicit int
" 规则也没有任何优势。只需添加 #include <stdlib.h>
。更一般地说,对于您调用的 任何 库函数,请阅读其文档和 #include
声明它的 header。
至于为什么您的一个程序出错而不是另一个程序出错,我无法解释。也许您使用不同的设置调用了编译器。在任何情况下,这都无关紧要——尽管您可能会研究如何配置您的编译器,以便它 总是 警告此类事情,因此您可以避免此类错误。
所以我在其他程序中没有遇到这个错误,但我在这个程序中遇到了。
这个程序是一个我没有得到错误的例子。
#include<stdio.h>
int main() {
system("pause");
} // end main
但是在下面这个程序中我得到了错误
#include <stdio.h>
//#include <stdlib.h>
// Takes the number from function1, calculates the result and returns recursively.
int topla (int n) {
if(n == 1)
return 3;
else
return topla(n-1) + topla(n-1) + topla(n-1);
}
// Takes a number from main and calls function topla to find out what is 3 to the
// power of n
int function1(int n) {
return topla(n);
}
int main() {
int n; // We us this to calculate 3 to the power of n
printf("Enter a number n to find what 3 to the power n is: ");
scanf("%d", &n);
function1(n);
system("pause");
} // end main
只需包含 stdlib.h
,但不要使用 system("pause")
,因为它不是标准的并且不会在每个系统上工作,只是一个简单的 getchar()
( 或一个涉及 getchar()
的循环,因为你已经使用了 scanf()
) 应该可以解决问题。
并且通常 system("pause")
可以在 windows 命令行程序中找到,因为 windows 命令提示符会在程序退出时关闭,所以可能 运行 来自命令提示符的程序直接会有所帮助,或者使用 IDE 来解决这个问题,例如 geany.
如果 scanf()
最后始终检查 return 值,而不是假设它有效。
注:此代码
return topla(n - 1) + topla(n - 1) + topla(n - 1)
你可以写成
return 3 * topla(n - 1);
而不是递归调用 topla()
3 次。
而且你并不真正需要 else
因为函数 returns 除非 n != 1
所以即使没有 else
递归也会在 n == 1
.
在这里你需要了解两件事。
首先,您的代码运行良好,程序确实找到了 3^n 的值。所以不用担心。
来到 system() 部分,
为了使用 system();
函数,您需要包含 stdlib.h header 文件,因为该函数在 header 中声明。
因此,最好包含 header(而不是对其进行评论)。
现在,在windows中使用了pause关键字来阻止控制台在程序完成后关闭,它只适用于windows。
请注意,system("pause");
也不是标准,它不适用于其他机器,即 linux,因为使用系统命令,您直接与命令行交互。在这方面,每个操作系统的命令都是特定的,不能用于其他OS.
所以最好使用 getchar();
,一个 C 标准库函数,来控制控制台 window.
system
函数在标准 header <stdlib.h>
中声明。如果您的程序调用 system()
,您 必须 有
#include <stdlib.h>
在源文件的顶部或附近。
但是您的部分问题是:为什么在您省略 #include
指令时编译器没有报错?
1990 年的 C 标准(有时称为 "ANSI C")允许调用未明确声明的函数。如果你写,例如:
system("pause");
没有可见的 system
函数声明,假设 system
是用 int
的 return 类型声明的,并且参数与中的参数匹配调用——在本例中,是 char*
类型的单个参数。这恰好与 system
的实际声明一致,因此对于 C90 编译器,您可以省略 #include
指令。一些支持 1999 年和 2011 年最新标准(不允许隐式声明)的 C 编译器仍然允许旧形式,可能带有警告,以便向后兼容。
即使给定一个 C90 编译器,依赖现已过时的 "implicit int
" 规则也没有任何优势。只需添加 #include <stdlib.h>
。更一般地说,对于您调用的 任何 库函数,请阅读其文档和 #include
声明它的 header。
至于为什么您的一个程序出错而不是另一个程序出错,我无法解释。也许您使用不同的设置调用了编译器。在任何情况下,这都无关紧要——尽管您可能会研究如何配置您的编译器,以便它 总是 警告此类事情,因此您可以避免此类错误。