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

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

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

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

15.08.2009, 20:05. Просмотров 3966. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2009, 20:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [C/C++]Не могу объявить static функцию в header файле. (C++):

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

Почему в файле все функции объявлены как static? - C++
Привет! В исходном коде Android я нашёл один файл нативного кода на C/C++. Все функции помечены как static и располагаются в одном файле,...

Конструктор копирования при инициализации в header файле - C++
Добрый вечер, где можно почитать про данное поведение? #include <iostream> using namespace std; struct A { int a; int b; ...

Как правильно объявить структуру в файле (модуле)? - C++
Возникла проблема такая проблема в файле Queue.h объявлена структура и указатели на нее #pragma once #ifndef QUEUE_H #define...

Объявить в заголовочном файле переменную типа std::string - C++
Почему я не могу в хедер файле объявит переменную стринг если писать std::string s="1111"; "лог ошибок будет писать что std...

Объявить функцию в STRUCT {} С++ - C++
Доброй ночи Создаю меню в консоле Задумка такая - для каждого пункта меню запускать свою функцию Как функцию объявить в структуре...

11
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 20:15 #2
насколько я знаю, static могут быть только функции члены.
но никак не обычные функции.
для того, чтобы функция не была доступна из других единиц трансляции достаточно определить её в неименованном пространстве имён.
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 20:35  [ТС] #3
Просто я ошибки-то не получаю,предупреждение какое-то не понятное
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,382
15.08.2009, 20:49 #4
zim22, static могут быть объявлены не только функции-члены, но и "свободные" функции. В этом случае, видимость static функции ограничена единицей трансляции, внутри которой видимость определяется по обычным правилам.
В C++ действительно, анонимное (неименованное) пространство имен является лучшей альтернативой для достижения цели сокрытия функции, static же рассматривается как устаревшее. Однако, поддерживается для обратной совместимости с C, в котором static - единственная возможность добиться желаемого.
"Я думаю так." (с) В.Пух

#pragma, если я правильно понял первоначальное сообщение, тебе необходимо обеспечить видимость функции более, чем в одной единице трансляции, так? Или что понимается под "модулем"? В C/C++ нет понятия "модуля", есть понятие "единицы трансляции". Уточни, плз, потом можно будет предложить какое-то решение.....
1
zim22
depict1
276 / 141 / 2
Регистрация: 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
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 21:25  [ТС] #6
Цитата Сообщение от CheshireCat Посмотреть сообщение
#pragma, если я правильно понял первоначальное сообщение, тебе необходимо обеспечить видимость функции более, чем в одной единице трансляции, так? Или что понимается под "модулем"? В C/C++ нет понятия "модуля", есть понятие "единицы трансляции". Уточни, плз, потом можно будет предложить какое-то решение.....
То есть наоборот,не более.Только в одной единице трансляции.Цель-ограничение области видимости с помощью static.Просто изучал static,решил попробовать-получил непонятное предупреждение от GCC.
0
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
15.08.2009, 21:32 #7
Правильно так
Цитата Сообщение от #pragma Посмотреть сообщение
C++
1
2
3
static Value Value::syntax_parserPrimary()     {         
 //Тут само тело функции      
}
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 21:48  [ТС] #8
Да нет же,эта функция не член класса! она просто возвращает объект.
0
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
15.08.2009, 21:50 #9
Извеняюсь. Попробуй перед определением функции написать extern
0
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 22:15  [ТС] #10
Мне надо наоборот,уменьшить область видимости,а extern её увеличивает.Все функции ведь по умолчанию extern.В-общем,мы ушли от вопроса,меня больше волнует,что за предупреждение я получил,а не сам факт достижения цели.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.08.2009, 22:23 #11
Цитата Сообщение от RazorQ Посмотреть сообщение
Попробуй перед определением функции написать extern
и что получится?
C++
1
2
свяжи не-свяжи тип функция() {
}
extern - указание для внешнего связывания
static - для внутреннего
0
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,979
Записей в блоге: 27
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2009, 00:27
Привет! Вот еще темы с ответами:

Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 - C++
Работаю под Windows 7 64x + Visual Studio 2010 Если считать в бинарном виде exe-файл в массив и посчитать стандартным алгоритмом CRC32...

Не могу объявить шаблонный класс - C++
Здравствуйте, имеется шаблонный класс динамического массива: template<typename T> class DynamicArray { public: ...

Не могу объявить вектор в классе - C++
Здравствуйте. Изучаю С++, пишу игру "Покер".) Только начал и сразу столкнулся с проблемой. При объявлении массива стрингов с помощью...

Как объявить переменную так, чтобы она была видна в .h файле? - C++
День всем добрый! Допустим, есть у меня код в главном .cpp файле: #include "Windows.h" #include "my.h" using namespace...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
16.08.2009, 00:27
Ответ Создать тему
Опции темы

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