Я получаю ошибку из следующего кода с помощью 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 ++", но не понимаю что не так с этим кодом.
В C++ static
в глобальных средствах объема / средствах объема пространства имен функция/переменная используется только в единице перевода, где это определяется, не в других единицах перевода.
Вот, пожалуйста попытка использовать статическую функцию от другой единицы перевода (Main.cpp
), чем та, в которой это определяется (File.cpp
).
Удаляют static
, и это должно хорошо работать.
Изменение
static int GetInteger();
к
int GetInteger();
static
в этом случае дает метод внутренний linkeage, означая, что можно только использовать его в единице перевода, где Вы определяете его.
Вы определяете его в File.cpp
и пытаетесь использовать его в main.cpp
, но основной не имеет определения для него, так как Вы объявили это static
.
Поскольку в этом случае, static
средства, что название функции имеет внутреннюю связь; то, что GetInteger
в одной единице перевода не связано с GetInteger
в любой другой единице перевода. Ключевое слово static
перегружается: в некоторых случаях это влияет на время жизни, и в других, связывая. Это особенно сбивает с толку здесь, потому что "статичный" также имя времени жизни. Функции и данные, объявленные в объеме пространства имен, всегда имеют статическое время жизни; когда static
появляется в их объявлении, оно вызывает внутреннюю привязку вместо внешнего.
функции, объявленные как статический arelocal к содержанию файла. Поэтому необходимо определить функцию в том же файле как те, кто называет его. Если Вы хотите сделать это вызываемым из другого файла, Вы не должны объявлять это как статичное.
От моего понимания статические функции являются именем, искаженным с именем файла, в котором они определяются поэтому, когда Вы включаете file.h в main.cpp, GetInteger () искажается с main.cpp, хотя Вы определили GetInteger () в file.cpp, но так как это статично, это искажается также, и компоновщик не может найти определение GetInteger (), поскольку никакая функция этим именем не существует.
я полагаю, что извлеченный урок, не объявляют статические функции в headerfile, как не предназначаются, чтобы быть частью интерфейса.
Если все находится в той же единице перевода, она должна работать. Вы, вероятно, не скомпилировали File.cpp в ту же единицу как Main.cpp.
g++ -Wall File.cpp Main.cpp
, Если каждый файл компилируется отдельно, функция должна быть сделана extern
, чтобы использоваться от различной единицы перевода.
extern int GetInteger();
, который совпадает с
int GetInteger();