|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.06.2013, 07:57 | #1 |
Пользователь
Регистрация: 21.05.2013
Сообщений: 13
|
модули, локальные и глобальные функции
Всем привет.
Объясните как это работает. у меня есть модуль А module_a.h Код:
Код:
Код:
Код:
Код:
Из представленного кода получается, что если я отключу module_a.h у меня возникнет ошибка компиляции, т.к. local_func_a() не будет иметь определения, как предусмотреть такой вариант и заново переопределить функцию через #ifndef ? P.S. я в модулях не ставил стражи. это просто пример а не рабочий код. Последний раз редактировалось el_gato_de_Ch; 04.06.2013 в 08:02. |
04.06.2013, 08:12 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
04.06.2013, 08:17 | #3 |
Пользователь
Регистрация: 21.05.2013
Сообщений: 13
|
я её вызываю внутри модуля b
из main я её не вызываю, я думаю что это не получится, вопрос в том почему я этой локальной функцией модуля A, могу пользоваться в модуле B, получается я не смогу объявить локальную функцию в B с таким же именем. Последний раз редактировалось el_gato_de_Ch; 04.06.2013 в 08:31. |
04.06.2013, 08:50 | #4 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Это не модули! Это просто кусок кода, вынесенный в другой файл (ну примитивно выражаясь). Соответственно (продолжая примитивно выражаться) при компиляции он все это пихает в файл с main и афигевает от кучи функций с одинаковыми именами (в данном случае это аш две функции local_func_a) Если вы так жаждете иметь по двадцать заголовочных файлов с кучей одинаково названных "Локальных" функций - пользуйтесь пространством имен (namespace).
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 04.06.2013 в 08:53. |
04.06.2013, 09:03 | #5 |
Пользователь
Регистрация: 21.05.2013
Сообщений: 13
|
тогда я что-то не пойму.
я создаю h файл, в нём объявляю интерфейс функции, я создаю с файл, в котором, подключаю заголовочный файл и определяю функцию. Затем через #include включаю h файл в проект, но весь код у меня вынесен в с файле. объясните пожалуйста, как это работает про модули я прочитал отсюда. в моём понимании, модуль, это некая абстракция состоящая из заголовка и тела, заголовком является *.h файл, а телом *.c файл при этом если я хочу обратится извне к этому модулю, то могу обращаться только к тому что написано в заголовке. Последний раз редактировалось el_gato_de_Ch; 04.06.2013 в 09:12. |
04.06.2013, 09:12 | #6 |
Форумчанин
Регистрация: 02.06.2011
Сообщений: 282
|
чтобы void local_func_a() не были видны в других единицах компиляции, нада писать static:
Код:
|
04.06.2013, 09:26 | #7 | |
Пользователь
Регистрация: 21.05.2013
Сообщений: 13
|
Цитата:
мне сейчас объяснили что в С, объявления всех функций являются по умолчанию глобальными, поэтому так и выходит, что, не смотря на то, что функция явно объявлена и определена в *.с файле её область видимости - глобальная (поправьте если я ошибаюсь). Поэтому она будет видна везде где будет включаться соответствующий h файл. Но я делал по шпаргалке (см ссылку в предыдущем посте) там локальные функции определены вот как я показал, т.е. без модификатора static. Но предыдущий вопрос про модули остаётся открытым. |
|
04.06.2013, 10:51 | #8 | ||||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Затем компоновщик (Linker) собирает модули в исполняемый файл. На этом этапе происходит "окончательная" сшивка кода каждого модуля; если модуль требует идентификатор, определения которого нет ни в одной доступной единице компиляции, возникает ошибка. Если обнаруживается два неотличимых идентификатора - это тоже ошибка. Цитата:
Однако Вы путаете. До тех пор, пока сценарий построения проекта включает компиляцию module_a.c, определение функции будет и компоновщик его подхватит. Другое дело, что перед использованием этой функции в любой единице компиляции нужно дать компилятору понять, что такое идентификатор local_func_a. Цитата:
Цитата:
Можно включить .h-файл, содержащий Код:
Код:
|
||||
04.06.2013, 11:36 | #9 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
04.06.2013, 17:52 | #10 |
Пользователь
Регистрация: 21.05.2013
Сообщений: 13
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
процедуры, модули и функции | Smirnov | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 02.03.2012 11:57 |
Локальные переменные vs Глобальные | Sibedir | Общие вопросы Delphi | 27 | 01.01.2011 13:02 |
Глобальные и локальные переменные | Kapitann | JavaScript, Ajax | 2 | 03.08.2010 14:24 |
Си++.Глобальные,локальные параметры. | Медина | Помощь студентам | 0 | 02.06.2009 21:51 |
Локальные и глобальные переменные. | Proger10 | Общие вопросы Delphi | 1 | 04.05.2009 05:55 |