Есть ли какое-либо использование для локальных объявлений функции?

Я бы использовал двойные кавычки, когда нельзя использовать одинарные кавычки, и наоборот:

"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'

Вместо:

'\'' + singleQuotedValue + '\''
"\"" + doubleQuotedValue + "\""
19
задан Thomas L Holaday 23 June 2009 в 20:01
поделиться

6 ответов

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

Например, я определяю некоторую структуру данных, например дерево или граф, и я не хочу раскрывать детали ее внутренней реализации, например, потому что я могу захотеть изменить или варьировать. Поэтому я предоставляю функции доступа и мутатора для его элементов, а также функцию обхода для итерации по элементам. Функция обхода имеет в качестве аргумента функцию, которая работает с элементом; задача функции обхода - выполнить функцию аргумента для каждого элемента и, возможно, каким-либо образом агрегировать результаты. Теперь, когда я вызываю функцию обхода, функция аргумента обычно представляет собой некоторую специализированную операцию, которая зависит от локального состояния и поэтому должна определяться как локальная функция. Необходимость проталкивать функцию с переменными, которые содержат локальное состояние, снаружи, чтобы быть глобальными, или во внутренний класс, созданный специально для их хранения, - это уродливо. Но это проблема C и Java, а не C ++.

2
ответ дан 30 November 2019 в 05:01
поделиться

Единственное, что я могу придумать, - это уменьшить объем объявлений функций:

int main()
{
    void doSomething();
    doSomething();
    return 0;
}

void otherFunc()
{
    doSomething();  // ERROR, doSomething() not in scope
}

void doSomething()
{
    ...
}

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

11
ответ дан 30 November 2019 в 05:01
поделиться

Единственное разумное применение, которое я вижу, - это позволить только одной функции в модуле компиляции знать о функции, определенной в другом модуле компиляции. Я думаю, что это было бы разумным использованием, но это единственное, о чем я могу думать, и я думаю, что это излишне.

2
ответ дан 30 November 2019 в 05:01
поделиться

Если вы хотите различать объявление функции без параметров и создание экземпляра класса с деструктором по умолчанию, пропустите скобки.

class C
{
  public:
    void foo() {}
};


int main()
{
    // declare function d, taking no arguments, returning fresh C
    C d();

    // instantiate class (leave parenthesis out)
    C c;
    c.foo();

    // call declared function
    C goo = d();

    return 0;
}

C d()
{
    C c;
    // ..
    return c;
}
-1
ответ дан 30 November 2019 в 05:01
поделиться

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

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

0
ответ дан 30 November 2019 в 05:01
поделиться

Это прототип предварительного объявления. Возможно, если у вас много локальных функций или локальных функций, которые вызывают друг друга вопреки порядку определения, вам это может понадобиться.

2
ответ дан 30 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: