43 / 43 / 17
Регистрация: 13.09.2012
Сообщений: 196
1

Функция объявлена с внешним связыванием

10.04.2013, 09:33. Показов 877. Ответов 9
Метки нет (Все метки)

Здравствуйте!

Дело в том, что в одном модуле несколько объявленных функций. Насколько я помню, если программа многофайловая, то функция объявленная (без static) доступна в других файлах. Но почему-то именно эти объявленные функции недоступны. Пришлось прописывать их прототипы.

main.c
int str_get(stream,sym);
...
Тогда они стали видны.

stream и sym это typedef объявления:

typedef unsigned char sym;
typedef struct stream_t stream_t, *stream;
С другими функциями в этом же проекте все прекрасно.
В чем может быть дело?

Читаю Прата у него про это не написано.....
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2013, 09:33
Ответы с готовыми решениями:

Cтатическая функция объявлена, но не определена
Не пойму из-за чего ошибка: статическая функция "int sum(int,int)" объявлена, но не определена ...

Функция не объявлена в этой области
Пишет что main не объявлена в этой области Действие происходит в функции lvl1 В чём ошибка? ...

Функция не объявлена в этой области
Ругается на то что не объявлен в области. В 5.4 работало. Помогите не могу понять как объявить в...

Каким образом объявлена и определена функция на С
cm_send(pfrom, mes) int *pfrom; struct cm_mes *mes; { write(pfrom, mes, sizeof(struct...

9
Модератор
Эксперт С++
11344 / 9310 / 5590
Регистрация: 18.12.2011
Сообщений: 24,836
10.04.2013, 10:28 2
Любая переменная для компилятора не видна, пока ее не объявить.
Поэтому и нужно объявлять функции описанные в других файлах.
1
43 / 43 / 17
Регистрация: 13.09.2012
Сообщений: 196
10.04.2013, 14:20  [ТС] 3
Я же вам говорю. Хорошо, есть два модуля (два файла .c)
Один содержит main, другой какие-то функции
Так вот если в другом модуле эти функции объявить, то они в модуле где main будут видны.

А у меня вот именно для этой одной функции нет

Добавлено через 3 часа 37 минут
stream sym ЭТО НЕ ПЕРЕМЕНННЫЕ
0
6 / 6 / 6
Регистрация: 19.03.2013
Сообщений: 50
10.04.2013, 15:21 4
Если вспомним незабвенные уроки по C, то там есть замечательный раздел: "классы памяти", когда вы определяете функцию вне блоков в одном файле многофайловой программы не указав явно класс памяти, ему неявно приписывается класс памяти extrern, что позволяет обращаться к нему из других файлов, но для корректности обращения в файле из которого планируется обращение необходимо написать объявление функции которую вы планируете использовать, а так как функция находится в другом файле т.е. внешняя, к ней надо приписать спецификатор класса памяти extern

к примеру это у нас лежит в util.c
C
1
2
3
4
int str_get(stream,sym)
{
//код реализации
}
а так мы используем данную ф-цию в main.c
C
1
2
3
4
5
6
 extern int str_get(stream,sym);
 
int main()
{
  str_get(fakeStream,fakeSym);
}
вообще как правило такое выносят в хедер файлы и потом их подключают по мере надобности, ну и конечно по typedef не забыть надо, что бы main знал что это за типы такие
1
43 / 43 / 17
Регистрация: 13.09.2012
Сообщений: 196
10.04.2013, 18:34  [ТС] 5
Нет, я это понимаю, но почему-то только с одной одной функции не работает, а с остальными работает..
почему ей нужно писать extern а остальным нет....

Добавлено через 2 часа 22 минуты
козлы...
0
Модератор
Эксперт С++
11344 / 9310 / 5590
Регистрация: 18.12.2011
Сообщений: 24,836
10.04.2013, 22:14 6
Такого быть не может!
Объявления функций нужны все.
Надо поискать повнимательнее и объявления остальных функций найдутся тоже.
0
43 / 43 / 17
Регистрация: 13.09.2012
Сообщений: 196
16.04.2013, 06:28  [ТС] 7
zss, смотрите

Использую мингв.
В модуле main.c я обращаю к функции print_text, которой находится в модуле func.c
Он печатает текст. Я прикрепил проект, не верите, смотрите.
Миниатюры
Функция объявлена с внешним связыванием  
Вложения
Тип файла: zip test.zip (37.2 Кб, 5 просмотров)
0
43 / 43 / 17
Регистрация: 13.09.2012
Сообщений: 196
16.04.2013, 06:32  [ТС] 8
ну и что?
в керригане ритчи, ничего про ваше не написано
в прата не написано
у страуструпа не написано, что вы теперь скажете?
0
Модератор
Эксперт С++
11344 / 9310 / 5590
Регистрация: 18.12.2011
Сообщений: 24,836
16.04.2013, 06:47 9
Действительно, компилятор Си, сам придумывает объявление функции,
когда видит ее вызов.
В С++ такого нет: поменяйте расширение файлов с "с" на "cpp".
1
43 / 43 / 17
Регистрация: 13.09.2012
Сообщений: 196
16.04.2013, 06:53  [ТС] 10
zss, фуууух, наконец-то все в моей голове уложилось.
Знал бы я эту долбанную деталь раньше, не возникали вопросы.
Просто до этого я очень много писал на С++, а потом перешел на Си (хотя обычно у людей происходит наоборот)....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2013, 06:53

Как определить, в какой .dll объявлена функция?
Всем привет, как узнать, в какой библиотеке находится функция printf, например? Именно в какой .dll...

Ошибка: error C2129: статическая функция объявлена, но не определена
В помощь начинающим изучать C++ хочу подсказать реальную причину этой ошибки. Так как реально в...

Пусть объявлена функция void f(int i,int &j){.}. Параметр j является параметром
1)Пусть объявлена функция void f(int i,int &j){...}. Параметр j является параметром a. по...

В каком хедере объявлена функция system/std::system?
zmei89, почистите буфер клавиатуры или #include <windows.h> system ("pause"); Добавлено через...


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

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

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