![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| inside_pointer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
Чем отличаются эти коды ?
Вообще может быть переменная extern неглобальной ? Она всегда используется только для связывания файлов, или может использоваться для чего-нибудь в одном файле ? |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
переменная extern неглобальной быть не может.
в одном файле extern переменная может ссылаться на переменную, описанную ниже:
твой код одинаков: при помощи extern ты не определяешь переменную, а только объявляешь, ссылаясь на некую глобальную i. |
|||
|
||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
То есть extern может ссылаться на глобальную переменную описанную выше, а может ссылаться на глобальную переменную описанную ниже ? У меня в книжке написан такой код, когда глобальная переменная одна(ну или массивы там до main идут), а функции которые используют эти массивы принимают void значения, в теле каждой функции массивы проставляются в виде extern массивов без указания размеров и говорится, что размеры не указываются тогда, когда они уже объявлены где-то выше в коде. Это сообщение отредактировал(а) inside_pointer - 29.3.2008, 15:36 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
может.
что касается массивов, то при определении надо указать размер, а при (extern) объявлении - необязательно. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при определение глобальной переменной компилятор выделяет место для нее
а при extern - компилятор предполагает, что место уже выделено где то (связывание произойдет при линковке) Это сообщение отредактировал(а) mes - 29.3.2008, 21:09 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в С и С++ это называется объявлением (declaration) и определением (definition) переменной.
|
|||
|
||||
| GSasha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 23.3.2008 Где: Ukraine Репутация: нет Всего: нет |
Привет всем!
На стадии компиляции все extern обьекты говорят компилятору "не ругайся, мол я полюбому где-то есть...", и тот просто оставляет пустое место под даный тип! Но на стадии сбора *.exe файла (линковки) эти пустые места должны заполниться реально существующими обьектами, и если компилятор был подвержен обману, то линкер наругает и выдаст матом - unresolved external symbol... |
|||
|
||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
Глобальное пространство единое для всех файлов или разбито на части ?
Имеет ли смысл использовать extern для создания отдельного модуля ? Например есть файл, его считаем модулем, в нём определяем глобальную переменную, потом в этом файле(модуле) ссылаемся на неё через extern. Будет ли в таком случае эта глобальная переменная влиять на переменную с таким же именем, находящуюся в другом файле(другом модуле) ?
Это что означает, что будет выделена память для глобальной переменной, а потом ещё память для локальных будет выделяться ? Или же будет происходит обращение к участку памяти, который был выделен для глобальной переменной выше ? Мне показалось всё быстрее работает когда используются просто ссылки через extern(или быстрее компилируется). |
|||
|
||||
| vinter |
|
||||||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
этого делать не надо, это бессмысленные действия
будет, глобальная видимость у всех связанных едениц трансляции одна.
шо?
единое
каких локальных? в данном случае у тебя глобальная переменная, для которой в определенном месте выделяется память. Выделяется она 1 раз. |
||||||||||
|
|||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
inside_pointer, тут уже говорили, что extern просто говорит компилятору: "переменная уже где-то определена, компилируй - остальное не твоя забота". Компилятор в итоге генерирует код: "... а в этом месте нужна переменная xxx ...". Линкер получает этот код и объединяет с остальными объектными файлами. Если переменная xxx только в одном из них найдена (определена), то все будет собрано, если не будет найдена, то возникнет ошибка "undefined reference", если будет найдено более одной переменной, то тоже возникнет ошибка, так как непонятно, которую из них использовать.
|
|||
|
||||
| MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
гы
вопрос, что будет выведено? Это сообщение отредактировал(а) MAKCim - 30.3.2008, 13:02 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
MAKCim, ну static тоже можно заюзать и ошибки не будет. Но речь ведь не об этом, правильно?
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
так в том-то вся и фишка, что если использовать static, то все будет детерминировано и результат будет 5 в этом же случае нет и и однозначно определенного результата -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
MAKCim, ну и зачем оно нужно?
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |