任何人都可以告诉我,我们可以在用户定义的函数中声明一个函数吗?比如
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
现在这些错误是什么,为什么会这样?
如果我在func2()
函数中调用main
,则会显示错误
undefined reference to func2
现在有人能告诉我这里有什么问题吗?
答案 0 :(得分:2)
C标准允许函数内的函数的声明(如在第一个代码片段中),但不包含函数内函数的定义(尽管某些编译器可能会提供它作为非标准的扩展名。)
对于C ++也是如此,尽管较新版本(C ++ 0x等)允许您定义匿名lambda函数。但这是不同的。
答案 1 :(得分:1)
gcc allows this in C only (not C++)来自-fnested-functions
,但这当然是非标准且不可移植的,所以除非你有充分的理由,否则你不应该使用嵌套函数。
答案 2 :(得分:0)
对于foo
,
int main(void) {
int foo(void);
}
不是foo
的定义。它是声明,它完全有效(虽然很奇怪:函数声明属于任何其他函数之外) C
。
C
不允许的内容是定义无法嵌套的内容。
/* INAVLID EXAMPLE */
int main(void) {
int foo(void) { return 0; }
}
答案 3 :(得分:0)
在声明之前调用func2()
时,C假定(根据标准)隐式声明int func2(...)
,但是当编译器找到func2()
定义时,它与先前的隐式声明不同,因此编译器会抱怨关于它。
如果func2()
在调用func2()
之前,则它既作为定义又作为声明,因此没有问题。
当然func2()
无法从main()
调用,因为其范围仅限于func1()
,就像您无法从其他函数访问局部变量一样。
正如其他人提到的,嵌套函数在C中不是标准函数,尽管某些编译器(如GCC)支持此功能。
答案 4 :(得分:0)
这只是对 Paul R 的答案的补充。 假设您的编译器是GCC, 结束了 document 在保罗的回答中说:
嵌套函数始终没有 连锁。用
extern
声明一个 或static
是错误的。如果你需要 以前声明嵌套函数 其定义,使用auto
所以func2
必须在调用之前声明为auto
如果您更改第二个代码
func1()
{
func2();
int i = 0;
...
到
func1()
{
auto func2(); /* declaration added */
func2();
int i = 0;
...
代码将被编译。