Есть ли применение для объявлений функций внутри функций? - PullRequest
19 голосов
/ 22 мая 2011

Мы можем объявить функции внутри функций (я хотел локальную переменную, но она анализируется как объявление функции):

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 ]

17 голосов
/ 22 мая 2011

Это действительно вопрос C, потому что это поведение было унаследовано непосредственно от C (хотя в C ++ это вызывает гораздо больше прессы из-за самого неприятного анализа ).

Я подозреваю, чтоОтвет (по крайней мере, в контексте C) состоит в том, что это позволяет вам определять существование объявлений функций именно там, где они необходимы.Может быть, это было полезно в первые дни C. Я сомневаюсь, что кто-то делает это больше, но ради обратной совместимости его нельзя удалить из языка.

7 голосов
/ 22 мая 2011

Это полезно, если вам нужно использовать внешнюю функцию, имя которой будет конфликтовать с внутренней (статической) функцией или переменной в текущем модуле перевода (исходном файле).Например (глупо, но он понимает суть):

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

static int foo()
{
    ssize_t read(int, void *, size_t);
    read(0, buf, 1);
}
3 голосов
/ 07 марта 2013

Объявление функции внутри другой функции скрывает другие перегруженные функции.например, ошибка компиляции в строке 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;
}
1 голос
/ 22 мая 2011

Это единственные причины "потому что это делает синтаксический анализатор проще" и "потому что стандарт так говорит"

Да, в основном.

Все, что может бытьобъявление функции, - это объявление функции.

К сожалению, это один из тех случаев "просто есть".

...