Относительно того, почему ваша декларация
void f() {
void g(); g();
}
лучше, чем этот
void g();
void f() {
g();
}
Обычно хорошо, если вы сохраняете объявления настолько локальными, насколько это возможно, чтобы получалось как можно меньше конфликтов имен. Я говорю, что можно спорить о том, действительно ли объявление функции локально (таким образом) действительно удачно, так как я думаю, что все же лучше обычным образом включить его заголовок и затем пойти "обычным" путем, что также не так смущает людей не зная об этом. Иногда полезно также обойти теневую функцию
void f() {
int g;
// oops, ::g is shadowed. But we can work around that
{
void g(); g();
}
}
Конечно, в C ++ мы могли вызывать функцию g
, используя its_namespace::g()
- но в старые времена C это было невозможно, и это позволяло программисту по-прежнему получать доступ к функции. Также обратите внимание, что хотя синтаксически это не одно и то же, семантически следующее также объявляет функцию в локальной области действия, которая фактически нацелена на другую область действия.
int main() {
using std::exit;
exit();
}
В качестве примечания, есть и другие ситуации, например, когда целевая область действия объявления , а не область действия, в которой появляется это объявление. В общем, объект, который вы объявляете, становится членом области действия в котором появляется декларация. Но это не всегда так. Рассмотрим, например, объявления друзей, где это происходит
struct X { friend void f() { std::cout << "WoW"; } };
int main() { void f(); f(); } // works!
Несмотря на то, что объявление функции (и определение!) f
произошло в области действия X
, сущность (сама функция) стала членом окружающего пространства имен.