#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) { } }
Комментариев нет:
Отправить комментарий