Статическая функция объявлена, но не определена в 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 ответов:
В C++,
staticв области global/namespace означает, что функция / переменная используется только в единице перевода, где она определена, а не в других единицах перевода.здесь вы пытаетесь использовать статическую функцию из другой единицы перевода (
Main.cpp), чем тот, в котором он определен (File.cpp).удалить
staticи он должен работать нормально.
изменить
static int GetInteger();до
int GetInteger();
staticв этом случае дает метод внутренняя компоновка, это означает, что вы можете использовать его только в переводе, где вы его определяете.вы определяете его в
File.cppи попробуйте использовать его вmain.cpp, но main не имеет определения для него, так как вы объявили егоstatic.
потому что в этом случае
staticозначает, что имя функции внутренняя связь; этоGetIntegerв одной единице перевода не связан кGetIntegerв любой другой единице перевода. Ключевое словоstaticis перегружено: в одних случаях это влияет на срок службы, а в других-на привязку. Это особенно запутанно здесь, потому что "статический" - это также имя 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();