Страницы

Поиск по вопросам

среда, 1 января 2020 г.

C++, возможно ли разрезолвить одну функцию внутри другой, локально

#cpp #c


В *.cpp файле есть множество static функций. Я бы не хотел загрязнять код лишними
предварительными объявлениями. Практически все функции вызывают лишь те функции, которые
определены ранее. Но есть несколько особенных функций, для которых приходится использовать
предварительное объявление того, с чем они работают.

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

Например:

static void f1(const float _f1)
{
    void f2(const float _f2);
    f2(_f1 + 1);// Error
}

static void f2(const float _f2)
{
}

int main()
{
    f1(1);
    return 0;
}


На что линкер сообщает: 

LNK2019 unresolved external symbol 'void f1(...)...'


Важное уточнение: код компилирую компилятором C++. Если же попытаться собрать код
C компилятором, то ошибки будут на этапе компиляции, а не линковки.
    


Ответы

Ответ 1



Внутри функций можно объявлять только функции с extern линковкой. Функции со static линковкой необходимо объявлять непосредственно в единице трансляции. static void f2(const float _f2); static void f1(const float _f1) { f2(_f1 + 1); } static void f2(const float _f2) { } int main() { f1(1); return 0; } Как альтернатива, чтобы не писать везде static, можно обернуть эти функции в анонимное пространство имен: namespace { void f2(const float _f2); void f1(const float _f1) { f2(_f1 + 1); } void f2(const float _f2) { } }

Комментариев нет:

Отправить комментарий