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

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

Main.cpp

#include "file.h"

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

File.h

static int GetInteger();

File.cpp

#include "file.h"

static int GetInteger()
{
   return 1;
}

Ошибка я добираюсь:

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

Я прочитал известную статью "Organizing Code File in C and C ++", но не понимаю что не так с этим кодом.

62
задан 30 May 2012 в 12:37

6 ответов

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

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

Удаляют static, и это должно хорошо работать.

119
ответ дан 31 October 2019 в 13:30

Изменение

static int GetInteger();

к

int GetInteger();

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

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

21
ответ дан 31 October 2019 в 13:30

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

6
ответ дан 31 October 2019 в 13:30

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

3
ответ дан 31 October 2019 в 13:30

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

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

2
ответ дан 31 October 2019 в 13:30

Если все находится в той же единице перевода, она должна работать. Вы, вероятно, не скомпилировали File.cpp в ту же единицу как Main.cpp.

g++ -Wall File.cpp Main.cpp

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

extern int GetInteger();

, который совпадает с

int GetInteger();
2
ответ дан 31 October 2019 в 13:30

Другие вопросы по тегам:

Похожие вопросы: