为什么我不能在另一个函数内定义一个函数?

83

这不是关于lambda函数的问题,我知道可以将lambda分配给变量。

允许我们在代码中声明但不定义函数的目的是什么呢?

例如:

#include <iostream>

int main()
{
    // This is illegal
    // int one(int bar) { return 13 + bar; }

    // This is legal, but why would I want this?
    int two(int bar);

    // This gets the job done but man it's complicated
    class three{
        int m_iBar;
    public:
        three(int bar):m_iBar(13 + bar){}
        operator int(){return m_iBar;}
    }; 

    std::cout << three(42) << '\n';
    return 0;
}

那么我想知道的是,为什么C++允许看起来无用的two和看起来更加复杂的three,但不允许one

编辑:

从答案中可以看出,在代码声明中可能能够防止命名空间污染,但是我希望听到的是为什么允许声明函数的能力,而禁止定义函数的能力。


3
第一个 one 是一个函数定义,另外两个是声明 - Some programmer dude
9
我觉得你把术语用反了--你想问的是“允许我们在代码内声明但不定义一个函数有什么意义?”而且,既然我们已经在这个话题上了,你可能想说“在函数内部”,因为所有的都是“代码”。 - Peter - Reinstate Monica
14
如果你想知道为什么这门语言有些怪癖和不一致:因为它经历了数十年的演变,通过许多人用许多不同的想法,从为不同目的而发明的语言中演化而来。如果你问为什么它有这个特定的怪癖:因为到目前为止没有人认为本地函数定义足够有用以标准化。 - Mike Seymour
4
@MikeSeymour说得很对。相比于Pascal等语言,C的结构不是很严谨,并且仅允许顶层函数定义。这是历史原因以及缺乏改变的需要。函数声明之所以可能,只是受一般情况下具有作用域的声明的影响。禁止函数声明将意味着额外的规则。 - Peter - Reinstate Monica
3
可能是因为通常情况下,允许在代码块中声明变量,没有特别禁止函数声明的原因;只允许所有声明似乎更加简单。但是,“为什么”并不是一个可以回答的问题;编程语言之所以存在就是因为它是这样演化而来的。 - Mike Seymour
显示剩余24条评论
11个回答

0
嵌套的函数声明可能是允许的,原因可能有: 1. 前向引用 2. 能够在有限的范围内声明函数指针并传递其他函数。
由于以下问题,不允许嵌套函数定义: 1. 优化 2. 递归(包含和嵌套定义的函数) 3. 可重入性 4. 并发和其他多线程访问问题。
从我的有限理解 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接