Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.87
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

[C/C++]Не могу объявить static функцию в header файле. - C++

15.08.2009, 20:05. Просмотров 3829. Ответов 11
Метки нет (Все метки)

Прочитал про static,и пытаюсь сделать функцию доступной только в пределах одного модуля.Поскольку функции вызывают друг друга(и ещё не помню,по какой хорошей причине),необходимо сначала объявить их в заголовке.
Пишу так в header-файле:
C++
1
static Value syntax_parserPrimary ();
а в файле .cpp :
C++
1
2
3
4
    static Value syntax_parserPrimary()
    {
         //Тут само тело функции
     }
На что получаю предупреждение:
Код
/home/user/Interpreter/syntax_parser.h|19|предупреждение:
 ‘Value syntax_parserPrimary()’ объявлена ‘static’, но нигде не определена|
В чём его смысл?Я же всё написал,и объявление,и определение? Или static функции надо тогда объявлять в самом начале .cpp модуля,который их использует,а не в header файле?То есть она вообще не должна быть в интерфейсе?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 20:15     [C/C++]Не могу объявить static функцию в header файле. #2
насколько я знаю, static могут быть только функции члены.
но никак не обычные функции.
для того, чтобы функция не была доступна из других единиц трансляции достаточно определить её в неименованном пространстве имён.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 20:35  [ТС]     [C/C++]Не могу объявить static функцию в header файле. #3
Просто я ошибки-то не получаю,предупреждение какое-то не понятное
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,328
15.08.2009, 20:49     [C/C++]Не могу объявить static функцию в header файле. #4
zim22, static могут быть объявлены не только функции-члены, но и "свободные" функции. В этом случае, видимость static функции ограничена единицей трансляции, внутри которой видимость определяется по обычным правилам.
В C++ действительно, анонимное (неименованное) пространство имен является лучшей альтернативой для достижения цели сокрытия функции, static же рассматривается как устаревшее. Однако, поддерживается для обратной совместимости с C, в котором static - единственная возможность добиться желаемого.
"Я думаю так." (с) В.Пух

#pragma, если я правильно понял первоначальное сообщение, тебе необходимо обеспечить видимость функции более, чем в одной единице трансляции, так? Или что понимается под "модулем"? В C/C++ нет понятия "модуля", есть понятие "единицы трансляции". Уточни, плз, потом можно будет предложить какое-то решение.....
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 20:56     [C/C++]Не могу объявить static функцию в header файле. #5
Цитата Сообщение от #pragma Посмотреть сообщение
Прочитал про static,и пытаюсь сделать функцию доступной только в пределах одного модуля
почитал я именно про static функции, а не про static функции-члены. Да, в Си можно объявлять функцию с квалификатором static. И это меняет её linkage на internal.

у меня варнингов/ошибок нет.
билдил на MSVC 2008 и GCC

C++
1
2
3
//header.h
static void fcn1();
static void fcn2();
C++
1
2
3
4
5
6
7
8
9
10
11
12
//main.cpp
#include "header.h"
 
static void fcn1() {
  fcn2();
}
 
static void fcn2() {
  fcn1();
}
 
int main() { fcn1(); }
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 21:25  [ТС]     [C/C++]Не могу объявить static функцию в header файле. #6
Цитата Сообщение от CheshireCat Посмотреть сообщение
#pragma, если я правильно понял первоначальное сообщение, тебе необходимо обеспечить видимость функции более, чем в одной единице трансляции, так? Или что понимается под "модулем"? В C/C++ нет понятия "модуля", есть понятие "единицы трансляции". Уточни, плз, потом можно будет предложить какое-то решение.....
То есть наоборот,не более.Только в одной единице трансляции.Цель-ограничение области видимости с помощью static.Просто изучал static,решил попробовать-получил непонятное предупреждение от GCC.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
15.08.2009, 21:32     [C/C++]Не могу объявить static функцию в header файле. #7
Правильно так
Цитата Сообщение от #pragma Посмотреть сообщение
C++
1
2
3
static Value Value::syntax_parserPrimary()     {         
 //Тут само тело функции      
}
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 21:48  [ТС]     [C/C++]Не могу объявить static функцию в header файле. #8
Да нет же,эта функция не член класса! она просто возвращает объект.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
15.08.2009, 21:50     [C/C++]Не могу объявить static функцию в header файле. #9
Извеняюсь. Попробуй перед определением функции написать extern
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 22:15  [ТС]     [C/C++]Не могу объявить static функцию в header файле. #10
Мне надо наоборот,уменьшить область видимости,а extern её увеличивает.Все функции ведь по умолчанию extern.В-общем,мы ушли от вопроса,меня больше волнует,что за предупреждение я получил,а не сам факт достижения цели.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 22:23     [C/C++]Не могу объявить static функцию в header файле. #11
Цитата Сообщение от RazorQ Посмотреть сообщение
Попробуй перед определением функции написать extern
и что получится?
C++
1
2
свяжи не-свяжи тип функция() {
}
extern - указание для внешнего связывания
static - для внутреннего
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2009, 00:27     [C/C++]Не могу объявить static функцию в header файле.
Еще ссылки по теме:

C++ Как вычисляется CRC32 в exe файле по адресу PE header + 0x8
C++ Почему в файле все функции объявлены как static?
Конструктор копирования при инициализации в header файле C++
Объявить в заголовочном файле переменную типа std::string C++
C++ Как объявить friend функцию класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17317 / 5565 / 347
Регистрация: 30.03.2009
Сообщений: 15,129
Записей в блоге: 26
16.08.2009, 00:27     [C/C++]Не могу объявить static функцию в header файле. #12
Всё гораздо проще. У тебя есть стандартная ошибка, про которую я пока не говорил тебе и планировал рассказать на этапе разгребания мусора. Ты всегда описание функций вытаскиваешь в *.h файл. Но это излишне. В *.h файл обычно размешают описание того, что будет использоваться за пределами данного модуля (файла *.cpp).

В случае со static функциями, если нужно их описание, то оно делается в файле *.cpp

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Описания */
static void func1 (void);
static void func2 (void);
 
/* Реализация */
static void
func1 (void)
{
  ...
  func2();
  ...
}
 
static void
func2 (void)
{
  ...
  func1();
  ...
}
Yandex
Объявления
16.08.2009, 00:27     [C/C++]Не могу объявить static функцию в header файле.
Ответ Создать тему
Опции темы

Текущее время: 00:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru