Ошибка компилятора c2129

Permalink

Cannot retrieve contributors at this time

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler Error C2129

Compiler Error C2129

11/04/2016

C2129

C2129

21a8223e-1d22-4baa-9ca1-922b7f751dd0

Compiler Error C2129

static function ‘function’ declared but not defined

A forward reference is made to a static function that is never defined.

A static function must be defined within file scope. If the function is defined in another file, it must be declared extern.

Студворк — интернет-сервис помощи студентам

В помощь начинающим изучать C++ хочу подсказать реальную причину этой ошибки. Так как реально в интернете на форумах рассказывается какая-то ерунда по поводу того, что static дает методу работать без объявления типа. Но ошибка из-за другого…

Если у Вас есть сам метод в одном файле file.cpp:

C++
1
2
3
4
static int func() 
{
return 25;
}

И в другом заголовочном файле global.h

C++
1
static int func();//Прототип функции для видимости – это ошибка, так делать не нужно

А вызов метода делается в другом файле MyKod.cpp

То у Вас появится Ошибка: error C2129: статическая функция объявлена, но не определена

У функции static я нашел пока два назначения:
1. Внутри класса это означает, что метод будет доступен без объявления типа переменной
2. Он служит также для определения видимости переменных и функций. Static означает, что эта функция и переменная будет видна только внутри одного файла.

1. Внутри класса:

C++
1
2
3
4
5
6
7
8
9
class a
    {
    public:
        static int func();
    };
int a::func() 
{
return 25;
}

2. Определение видимости

C++
1
2
3
4
static int func() 
{
return 25;
}


За место static можно поставить для переменной:
Для методов точно не уверен будут ли работать registr и extern. Прототип функции можно объявлять без extern — работать будут.

registr – переменная будет хранится только в регистре. Позволяет не использовать оперативную память. Нужна для ускорения процессов.

extern – переменная является глобальной. Помещается обычно в заголовочный файл, для того, чтобы сделать ее существующей для других файлов. Чтобы компилятор не ругался. Так как эта глобальная переменная объявляется один раз в одном cpp файле. И для каждого другого файла переменная объявляется с extern. Посмотрите мою тему по объявлению глобальных переменных. Результат работы над ошибками по поводу глобальных переменных на с++

static – переменные и методы будут видны только внутри одного файла(.cpp). На других файлах ее не существует. Именно из-за того, что новички ее используют в другом файле и чужой код копируют со значением static и потом с ужасом замечают, что код не работает. А код просто не может работать в другом файле, потому, что static делает видимость методов и переменных только для одного фала(cpp), в котором это объявлено. Это нужно, чтобы отделить методы и переменные от других фалов для уменьшения влияния переменных между файлами (ООП). Если хотите, чтобы метод был доступен в других файлах просто уберите static.

error C2129: static function ‘void func(int,char *)’ declared but not defined

I read that:

A static function must be defined within file scope. If the function is defined in another file, it must be declared extern.

Does file scope mean it must be defined in either the C++ or .h, or just within the .h file its declared in?

asked Apr 26, 2012 at 12:38

discodowney's user avatar

C++ compiler doesnot see the .h files, the content of the file will be placed into the cpp file by the pre-processor itself. Here the file scope would be that function should be in the cpp file.

answered Apr 26, 2012 at 12:43

Naveen's user avatar

NaveenNaveen

74.2k47 gold badges174 silver badges233 bronze badges

4

If the function is defined in another file, it must be declared
extern.

In this statement, «another file» translates to «another object file» which will eventually be linked together after compiling. Like Naveen answered, the compiler doesn’t really care in which source file the function is declared in.

answered Apr 26, 2012 at 12:48

teukkam's user avatar

teukkamteukkam

4,2371 gold badge25 silver badges35 bronze badges

i had the error LNK2005 for both of these functions but after dividing the .h file, putting the declarations only in the .h and the definitions in the .c file it went away. But now i’m getting this error

 error C2129: static function ‘unsigned char dtqueueEnqueue(gen_queue *,msg_pckt)’ declared but not defined
        c:workingesnltrunkcodec8051nsfrtls_routingqueuedt_queue.h(9) : see declaration of ‘dtqueueEnqueue’

ohh… and i’m Visual C++ 2008 Express Edition with the c compiler

the declaration is as it follows:

#ifndef DT_QUEUE_H
#define DT_QUEUE_H

#include «gen_queue.h»
#include <stdlib.h>

//Drop tail enqueue Function
static uint8_t dtqueueEnqueue(gen_queue* self, PACKET enq);

// Drop tail Dequeue Function

  static uint8_t dtqueueDequeue(gen_queue* self);

#endif

and the define in dt_queue.c:

#include «c:workingesnltrunkcodec8051nsfrtls_routingqueuedt_queue.h»
#include «c:workingesnltrunkcodec8051nsfrtls_routingqueuegen_queue.h»
#include <stdlib.h>

//Drop tail enqueue Function
static uint8_t dtqueueEnqueue(gen_queue* self, PACKET enq)
{
    if(self->_q_size<MAX_QUEUE_SIZE)
    {
           self->_dt_pack_queue[self->_q_size]=enq;
           self->_q_size=self->_q_size+1;
           return 1;
    }
    else return 0;

}
// Drop tail Dequeue Function

  static uint8_t dtqueueDequeue(gen_queue* self)
{
    uint8_t i;
    if ( 0 < self->_q_size )
    {
        for (i=0;i<self->_q_size-1;i++)
            self->_dt_pack_queue[i]=self->_dt_pack_queue[i+1];
        self->_q_size-=1;
        return 1;
    }
    else
        return 0 ;
}

ошибка C2129: статическая функция ‘void func (int, char *)’ объявлено, но не определено

Я читал, что:

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

Определяет ли область видимости файла в либо С++ или .h, либо только в файле .h, объявленном в?

26 апр. 2012, в 15:38

Поделиться

Источник

2 ответа

Компилятор С++ не видит файлы .h, содержимое файла будет помещено в файл cpp самим препроцессором. Здесь область файла будет состоять в том, что функция должна находиться в файле cpp.

Naveen
26 апр. 2012, в 09:55

Поделиться

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

В этом утверждении «другой файл» переводится в «другой файл объекта», который в конечном итоге будет связан вместе после компиляции. Как ответил Навей, компилятор действительно не заботится о том, в каком исходном файле объявлена ​​функция.

teukkam
26 апр. 2012, в 10:27

Поделиться

Ещё вопросы

  • 1pandas read_csv устанавливает `dtype` по индексу столбца (не по имени)
  • 0Странная проблема со смещенной вершиной в jquery
  • 1Выбор контактов в диалоге
  • 0setTimeout window.open не может принять this.href
  • 1jaxb — отношения многие ко многим
  • 1Как хранить неживые предметы
  • 0Как скрыть / показать форму, используя jQuery в следующем сценарии?
  • 1Angular2 Проверка ввода с помощью регулярных выражений
  • 1Aiohttp маршрутизация (aiohttp.web.RouteTableDef)
  • 1Ошибка Android при загрузке неправильных цветов в ночном режиме
  • 1Почему PageableListView не имеет конструктора без модели или списка
  • 0как создать дочерние узлы с помощью запроса php xpath
  • 1Python запускается из командной строки и запускает версию 3.6, а в моих файлах — версию 3.4
  • 0Каким должен быть цвет кнопки в html после отключения?
  • 1React-Native добавляет var в тег просмотра
  • 0Как подсчитать конкретные строки в GROUP BY SQL
  • 1Повторение вызова метода
  • 0php mysql Обновление списка опций таблицы
  • 1Переучите глубокое обучение, добавив еще несколько изображений в набор данных
  • 0Плагин Joomla для отображения данных из базы данных
  • 1Обход XML-схем не удался
  • 0Как проверить поле ввода внутри ng-repeat
  • 0В AngularJs Как объединить функцию как универсальную для использования для контроллера изменений?
  • 1Python не может найти это сгруппированное имя
  • 1Озадаченный чем-то в методе .reduce () (Javascript)
  • 0Передать параметр в функцию контроллера Angularjs из директивы
  • 1заменить все выбранные значения как NaN в пандах
  • 0AngularJS — объект не передан в модальный диалог
  • 1EditText странное поведение фокуса
  • 1HTML 5 Геолокация не работает в Safari
  • 0Как включить результат моего сервлета Java в файл PHP?
  • 0Javascript / JQuery сравнить входное значение с массивом
  • 1Веб-анализ Python с запросами — после входа в систему
  • 1Питон: быстрая сортировка с медианой из трех
  • 0Qt / C ++ / Valgrind Invalid Readsize 8 при отключении QTcpSocket
  • 0как отобразить моих пользователей из firebase с помощью angularjs
  • 0C ++ Win32 активируется MDI szTitle
  • 1Нужен ли семафор, когда один процесс пишет, а другой читает?
  • 0Два всплывающих окна не работают должным образом
  • 0Получить идентификатор ul и li снизу вверх в jquery
  • 1Как получить один предмет в пиребазе?
  • 0Связывание AngularJS и TypeScript не работает
  • 0выбранный параметр не отображается в раскрывающемся списке Angularjs
  • 0Получение contact.id после сохранения контактного плагина Cordova
  • 1Как я могу измерить ширину и высоту повернутого элемента в Javascript?
  • 0ngSwitch не обновляется при изменении модели данных
  • 1Как программно изменить изображение-макет пользовательского предпочтения?
  • 0Smarty strpos и substr для получения текста после последней косой черты в URL
  • 1Запись в существующий XML-файл без замены его содержимого (XmlWriter)
  • 0Фронт-контроллер PHP и .htaccess с XAMPP и Windows

Сообщество Overcoder

Понравилась статья? Поделить с друзьями:
  • Ошибка компилятора c2109
  • Ошибка компилятора c2106
  • Ошибка компилятора c2102
  • Ошибка компилятора c2088
  • Ошибка компилятора c2079