функция forward-объявление внутри другой функции - PullRequest
3 голосов
/ 08 февраля 2012

Код идет первым:

void foo(int x)
{
    void bar(int);  //is this forward-decl legal?
    bar(x);
}

void bar(int x)
{
    //do stuff
}

В приведенном выше коде foo вызывает bar, обычно я ставлю forward-decl bar вне foo, например так:

void bar(int);
void foo(int x) 
{
    bar();
}

Во-первых, я думаю, что все в порядке, чтобы поместить bar forward-decl внутрь foo, верно?

Во-вторых, рассмотрите это, если bar является static функция, подобная этой:

static void bar(int x)
{
    //do stuff
}

Тогда как мне это объявить вперед?Я имею в виду, должен ли forward-decl принять или опустить static?

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012
  1. Да, законно помещать предварительное объявление в другую функцию.Тогда это можно использовать только в этой функции.И будет использоваться пространство имен функции, в которую вы ее поместите, поэтому убедитесь, что они совпадают.

  2. Стандарт гласит: «Связи, подразумеваемые последовательными объявлениями для данного объекта, должны согласовываться."(раздел 7.1.2).Так что да, прототип тоже должен быть static.Однако это не похоже на то, что размещение прототипа функции static в другой функции вообще разрешено.«В блоке не может быть static объявлений функций» (тот же раздел).

4 голосов
/ 08 февраля 2012

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

int blah() {
    { void foo(); }

    foo(); // error: foo not declared
}

Во-вторых, вам нужно только поставить static на прототип , иначе компилятор будет жаловаться на то, что bar объявлен extern (все прототипы неявно extern, если они не помечены явно в противном случае, например, static). Обратите внимание, что static прототипы функций не могут появляться внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...