函数内部是否有函数声明?

时间:2011-05-22 17:06:50

标签: c++ c declaration

我们可以在函数内部声明函数(我想要一个局部变量,但它作为函数声明解析):

struct bvalue;
struct bdict {
    bdict(bvalue);
}
struct bvalue {
    explict operator bdict() const;
}
struct metainfo {
    metainfo(bdict);
}
void foo(bvalue v) {
    metainfo mi(bdict(v)); // parses as function declaration
    metainfo mi = bdict(v); // workaround
                            // (this workaround doesn't work in the presence of explicit ctors)
}

唯一的原因是“因为它使解析器变得更简单”和“因为标准是这样说的”,还是有一个不明确的用途?

4 个答案:

答案 0 :(得分:17)

这实际上是一个C问题,因为这种行为是直接从C继承的(尽管由于最令人烦恼的解析而在C ++中得到更多的压力)。

我怀疑答案(至少在C的上下文中)是,这允许您将函数声明的存在范围精确到适合它们的位置。也许这在C的早期是有用的。我怀疑任何人都这样做了,但为了向后兼容,它不能从语言中删除。

答案 1 :(得分:7)

如果您需要使用名称与当前翻译单元(源文件)中的内部(静态)函数或变量冲突的外部函数,这将非常有用。例如(愚蠢但它得到了重点):

static int read(int x)
{
    return bar(x);
}

static int foo()
{
    ssize_t read(int, void *, size_t);
    read(0, buf, 1);
}

答案 2 :(得分:3)

另一个函数内的函数声明隐藏了其他重载函数。例如第7行的编译器错误

#include <iostream>

void f(int);
int main() {

    void f(char *);
    f(10);              // Line 7
    f("Hello world");
    return 0;
}

void f(int a) {
    std::cout << a;
}

void f(char *str) {
    std::cout << str;
}

答案 3 :(得分:1)

  

唯一的原因是“因为它造成的   解析器更简单“和”因为   标准如此说“

是的,基本上。

所有可以作为函数声明的东西, 是一个函数声明。

不幸的是,这是“正是”案件之一。