C++ C中的嵌套函数?
有人能告诉我我们能在用户定义函数中声明函数吗?比如C++ C中的嵌套函数?,c++,c,C++,C,有人能告诉我我们能在用户定义函数中声明函数吗?比如 int sum(int x, int y) { int fun( float x); } 我们可以在函数中定义函数吗?我知道我们不能在函数中定义函数 但我只是这样做了,它的工作很好。下面给出了代码: { int main() { func1(); return 0; } func1() { int i = 0; auto func
int sum(int x, int y)
{
int fun( float x);
}
我们可以在函数中定义函数吗?我知道我们不能在函数中定义函数
但我只是这样做了,它的工作很好。下面给出了代码:
{
int main()
{
func1();
return 0;
}
func1()
{
int i = 0;
auto func2()
{
i = 10;
printf("Heloo i am func 2\n");
}
printf("Heloo i am func 1\n");
func2();
}
}
它工作得很好
现在有谁能告诉我函数中的函数是如何定义或正常工作的
谁能给我解释一下代码为什么起作用
现在,当我修改了几行代码时,它给了我以下问题
变化如下:
代码:
{
func1()
{
func2();
int i = 0;
auto func2()
{
i = 10;
printf("Heloo i am func 2\n");
}
printf("Heloo i am func 1\n");
}
错误:
error: static declaration of ‘func2’ follows non-static declaration
note: previous implicit declaration of ‘func2’ was here
这些错误是什么?为什么会出现
如果我在main
函数中调用func2()
,它将显示如下错误
对func2的未定义引用
现在有谁能告诉我这里出了什么问题吗?C标准允许在函数中声明函数(如您的第一个代码片段),但不允许在函数中定义函数(尽管有些编译器可能将其作为非标准扩展提供)
<> P> C++也是如此,尽管较新版本(C++ 0x等)允许您定义匿名lambda函数。但是这是不一样的。通过
-fnested functions
,但这当然是非标准和不可移植的,所以除非有很好的理由,否则您可能不应该使用嵌套函数。这是因为foo
int main(void) {
int foo(void);
}
不是foo
的定义。它是一个声明,在C
中完全有效(尽管很奇怪:函数声明不属于任何其他函数)
C
不允许的是,定义不能嵌套
/* INAVLID EXAMPLE */
int main(void) {
int foo(void) { return 0; }
}
当您在声明之前调用func2()
时,C(根据标准)假定隐式声明int func2(…)
,但当编译器找到func2()
定义时,它与以前的隐式声明不同,所以编译器对此表示不满。
如果调用func2()
之前有func2()
,则它同时充当定义和声明,因此没有问题
当然,不能从main()
调用func2()
,因为它的作用域仅限于func1()
,就像不能从另一个函数访问局部变量一样
正如其他人提到的,嵌套函数在C中不是标准的,尽管有些编译器(如GCC)支持此功能。这只是Paul R答案的补充。 假设您的编译器是GCC, 世界末日 保罗在回答中说: 嵌套函数始终没有 联系。用
extern
或静态
错误。如果你需要
在之前声明嵌套函数的步骤
其定义,使用auto
因此,在调用它之前,必须将func2
声明为auto
。如果您更改第二个代码
func1()
{
func2();
int i = 0;
...
到
代码将被编译。太多的问号……应该注意的是,这是否被允许只是语言书呆子的好奇。在现实世界的应用程序中,您永远不会在其他函数中编写声明或定义。pal在定义之前调用func2时发生了什么错误?我想知道这有什么不同。代码为什么要执行?@user:可能您是在使用支持嵌套函数的编译器进行编译。它可能需要在调用函数之前声明函数(对于“标准”非嵌套函数来说,这当然是正确的)。在不起作用的代码段中,情况并非如此。
func1()
{
auto func2(); /* declaration added */
func2();
int i = 0;
...