Статическая функция объявлена, но не определена в 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
в любой другой единице перевода. Ключевое слово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();