Как вы можете получить доступ к функции из другого модуля перевода, не включая файлы? - PullRequest
0 голосов
/ 20 ноября 2018

Я читал о статических функциях, и было сказано, что если функция статическая, вы можете использовать ее только в одном и том же файле.После тестирования я понял, что это неправда, потому что если вы включите файл со статической функцией, вы все равно сможете использовать эту функцию в другом файле.Затем я читаю разъяснение, что вы можете использовать статическую функцию только в одной и той же единице перевода.Хорошо, это имеет смысл, потому что это означает, что .cpp + включает, но даже если функция не является статичной, вы все равно не сможете использовать ее, если не включите файл.Так как вообще возможно получить доступ к функции из другого модуля перевода, не включая ничего, в чем смысл статических функций?

Main.cpp

#include "Staticf.h"

void main()
{
  visible();
}

Staticf.h

#pragma once
#include <iostream>
using namespace std;

static void visible()
{
  cout << "Static function is visible\n";
}

Компилируется нормально.Если я сделаю эту функцию нестатичной и удалю #include "Staticf.h", я не смогу использовать ее в любом случае.Так зачем нужны статические функции, если вы не можете получить доступ и к нестатическому?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

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

somemodule.cpp

void func()
{
  // details
}

main.cpp

void func();

int main()
{
  func();
}

ItКонечно, рекомендуется помещать предварительное объявление в заголовочный файл.

Так что же использовать статические функции?

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

0 голосов
/ 20 ноября 2018

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

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

...