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

59

Я получаю сообщение об ошибке из следующего кода с использованием 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.

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

Я использую Visual Studio. Sait
Как вы связываете это? & quot; gcc -o Test Main.cpp File.cpp -lstdc ++ & quot; или где-нибудь в XCode / VisualStudio / Eclipse? Viktor Latypov
Что @ViktorLatypov сказал. Покажите нам, как вы его компилируете. Brady
@ViktorLatypov: Я столкнулся с этим, выбрав файл в Visual Studio 2013 в проекте C ++ / CLI и нажав кнопку компиляции. (Кнопка компиляции для кнопки C ++ не связывается, и эта ошибка не должна возникать, но, может быть, C ++ / CLI отличается?) (Ой, подождите, я только что увидел верхний ответ. Я преобразовалstatic класс для пространства имен & gt;. & lt; Забыл.) Mooing Duck

Ваш Ответ

6   ответов
3

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

2

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

g++ -Wall File.cpp Main.cpp

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

extern int GetInteger();

который так же, как

int GetInteger();
Error: User Rate Limit Exceeded
114

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

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

Удалитьstatic и это должно работать нормально.

6

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

20

+ Изменить

static int GetInteger();

в

int GetInteger();

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

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

2

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

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

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