Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

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

15.08.2009, 20:05. Просмотров 4960. Ответов 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 файле?То есть она вообще не должна быть в интерфейсе?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2009, 20:05
Ответы с готовыми решениями:

Объявить функцию в заголовочном файле unit1.h в секцию private и public
Добрый день. По данному вопросу на форуме есть материал, но его недостаточно. Не можете подсказать...

Не могу создать 2 класса header-composition и header-social
При создании 2 классов. например header-composition и hedaer-social первый работает, а второй уже...

ListView, как в шаблоне объявить Header?
Как в шаблоне DataTemplate объявить Header ListView (возраст, имя)? Спасибо, за ответ. ...

Как объявить в классе static-массив, не используя cpp файлы
Есть шаблон. В шаблон в качестве аргумента надо передать массив. Именно в качестве аргумента...

11
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 20:15 2
насколько я знаю, static могут быть только функции члены.
но никак не обычные функции.
для того, чтобы функция не была доступна из других единиц трансляции достаточно определить её в неименованном пространстве имён.
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
15.08.2009, 20:35  [ТС] 3
Просто я ошибки-то не получаю,предупреждение какое-то не понятное
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.08.2009, 20:49 4
zim22, static могут быть объявлены не только функции-члены, но и "свободные" функции. В этом случае, видимость static функции ограничена единицей трансляции, внутри которой видимость определяется по обычным правилам.
В C++ действительно, анонимное (неименованное) пространство имен является лучшей альтернативой для достижения цели сокрытия функции, static же рассматривается как устаревшее. Однако, поддерживается для обратной совместимости с C, в котором static - единственная возможность добиться желаемого.
"Я думаю так." (с) В.Пух

#pragma, если я правильно понял первоначальное сообщение, тебе необходимо обеспечить видимость функции более, чем в одной единице трансляции, так? Или что понимается под "модулем"? В C/C++ нет понятия "модуля", есть понятие "единицы трансляции". Уточни, плз, потом можно будет предложить какое-то решение.....
1
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 20:56 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(); }
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
15.08.2009, 21:25  [ТС] 6
Цитата Сообщение от CheshireCat Посмотреть сообщение
#pragma, если я правильно понял первоначальное сообщение, тебе необходимо обеспечить видимость функции более, чем в одной единице трансляции, так? Или что понимается под "модулем"? В C/C++ нет понятия "модуля", есть понятие "единицы трансляции". Уточни, плз, потом можно будет предложить какое-то решение.....
То есть наоборот,не более.Только в одной единице трансляции.Цель-ограничение области видимости с помощью static.Просто изучал static,решил попробовать-получил непонятное предупреждение от GCC.
0
587 / 354 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
15.08.2009, 21:32 7
Правильно так
Цитата Сообщение от #pragma Посмотреть сообщение
C++
1
2
3
static Value Value::syntax_parserPrimary()     {         
 //Тут само тело функции      
}
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
15.08.2009, 21:48  [ТС] 8
Да нет же,эта функция не член класса! она просто возвращает объект.
0
587 / 354 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
15.08.2009, 21:50 9
Извеняюсь. Попробуй перед определением функции написать extern
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
15.08.2009, 22:15  [ТС] 10
Мне надо наоборот,уменьшить область видимости,а extern её увеличивает.Все функции ведь по умолчанию extern.В-общем,мы ушли от вопроса,меня больше волнует,что за предупреждение я получил,а не сам факт достижения цели.
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 22:23 11
Цитата Сообщение от RazorQ Посмотреть сообщение
Попробуй перед определением функции написать extern
и что получится?
C++
1
2
свяжи не-свяжи тип функция() {
}
extern - указание для внешнего связывания
static - для внутреннего
0
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
16.08.2009, 00:27 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();
  ...
}
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2009, 00:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как в Button17 объявить делегат на методы класса static string toString (Complex A)
Доврый день! using System; using System.Collections.Generic; using System.ComponentModel;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.