Статическая функция объявлена, но не определена в C++


Я получаю сообщение об ошибке со следующим кодом на C++.

Главная.cpp

#include "file.h"

int main()
{
   int k = GetInteger();
   return 0;
}

.h

static int GetInteger();

.cpp

#include "file.h"

static int GetInteger()
{
   return 1;
}

ошибка, которую я получаю:

Error C2129: static function 'int GetInteger(void)' declared but not defined.

Я читал знаменитую статью " организация файла кода в C и c++", но не понимаю, что не так с этим кодом.

6 56

6 ответов:

В C++, static в области global/namespace означает, что функция / переменная используется только в единице перевода, где она определена, а не в других единицах перевода.

здесь вы пытаетесь использовать статическую функцию из другой единицы перевода (Main.cpp), чем тот, в котором он определен (File.cpp).

удалить static и он должен работать нормально.

изменить

static int GetInteger();

до

int GetInteger();

static в этом случае дает метод внутренняя компоновка, это означает, что вы можете использовать его только в переводе, где вы его определяете.

вы определяете его в File.cpp и попробуйте использовать его в main.cpp, но main не имеет определения для него, так как вы объявили его static.

потому что в этом случае static означает, что имя функции внутренняя связь; это GetInteger в одной единице перевода не связан к GetInteger в любой другой единице перевода. Ключевое слово static is перегружено: в одних случаях это влияет на срок службы, а в других-на привязку. Это особенно запутанно здесь, потому что "статический" - это также имя a жизненный цикл. Функции и данные, объявленные в области пространства имен, всегда имеют статическое время жизни; когда static появляется в их объявлении, оно вызывает внутреннюю привязку, а не внешнюю.

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

насколько я понимаю, статические функции имеют имя, искаженное именем файла, в котором они определены, поэтому при включении файла.h в основном.cpp, GetInteger () получить искалечены с main.cpp, хотя вы определили GetInteger () в файле.cpp, но поскольку он статичен, он также искажается, и компоновщик не может найти определение GetInteger (), поскольку никакой функции с этим именем не существует.

Я считаю, что полученный урок не объявляет статические функции в headerfile, поскольку они не предназначены для того, чтобы быть частью взаимодействие.

если все находится в той же единице перевода он должен работать. Вы, вероятно, не компилировали файл.cpp в тот же блок, что и Main.СРР.

g++ -Wall File.cpp Main.cpp

если каждый файл компилируется отдельно, эта функция должна быть extern для использования с a различные преобразования.

extern int GetInteger();

что же

int GetInteger();