Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переменные extern 
V
    Опции темы
inside_pointer
Дата 29.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Чем отличаются эти коды ?
Код

int i;

int main()
{
    extern int i;
    
    i = 0;
}


Код

int i;

int main()
{
    i = 0;
}


Вообще может быть переменная extern неглобальной ?
Она всегда используется только для связывания файлов, или может использоваться для чего-нибудь в одном файле ?
PM MAIL   Вверх
baldina
Дата 29.3.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



переменная extern неглобальной быть не может.
в одном файле extern переменная может ссылаться на переменную, описанную ниже:
Код

extern int i;
...
++i;
...
int i;

твой код одинаков: при помощи extern ты не определяешь переменную, а только объявляешь, ссылаясь на некую глобальную i.
PM MAIL   Вверх
inside_pointer
Дата 29.3.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(baldina)

в одном файле extern переменная может ссылаться на переменную, описанную ниже:

То есть extern может ссылаться на глобальную переменную описанную выше, а может ссылаться на глобальную переменную описанную ниже ?

У меня в книжке написан такой код, когда глобальная переменная одна(ну или массивы там до main идут), а функции которые используют эти массивы принимают void значения, в теле каждой функции массивы проставляются в виде extern массивов без указания размеров и говорится, что размеры не указываются тогда, когда они уже объявлены где-то выше в коде.

Это сообщение отредактировал(а) inside_pointer - 29.3.2008, 15:36
PM MAIL   Вверх
baldina
Дата 29.3.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



может.
что касается массивов, то при определении надо указать размер, а при (extern) объявлении - необязательно.
PM MAIL   Вверх
vinter
Дата 29.3.2008, 16:39 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(inside_pointer @  29.3.2008,  16:35 Найти цитируемый пост)
То есть extern может ссылаться на глобальную переменную описанную выше, а может ссылаться на глобальную переменную описанную ниже ?

extern говорит что "где-то в глобальной пр-ве есть переменная с таким именем."


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 29.3.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



при определение глобальной переменной компилятор выделяет место для нее
а при extern - компилятор предполагает,  что  место уже выделено где то (связывание произойдет при линковке)

Это сообщение отредактировал(а) mes - 29.3.2008, 21:09


--------------------
PM MAIL WWW   Вверх
baldina
Дата 29.3.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



в С и С++ это называется объявлением (declaration) и определением (definition) переменной.
PM MAIL   Вверх
GSasha
Дата 29.3.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



Привет всем!
На стадии компиляции все extern обьекты говорят компилятору "не ругайся, мол я полюбому где-то есть...", и тот просто оставляет пустое место под даный тип!
Но на стадии сбора *.exe файла (линковки) эти пустые места должны заполниться реально существующими обьектами, и если компилятор был подвержен обману, то 
линкер наругает и выдаст матом - unresolved external symbol... smile 
PM MAIL ICQ   Вверх
inside_pointer
Дата 30.3.2008, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Глобальное пространство единое для всех файлов или разбито на части ?

Имеет ли смысл использовать extern для создания отдельного модуля ?

Например есть файл, его считаем модулем, в нём определяем глобальную переменную, потом в этом файле(модуле) ссылаемся на неё через extern.
Будет ли в таком случае эта глобальная переменная влиять на переменную с таким же именем, находящуюся в другом файле(другом модуле) ?

Цитата(GSasha)

Но на стадии сбора *.exe файла (линковки) эти пустые места должны заполниться реально существующими обьектами

Это что означает, что будет выделена память для глобальной переменной, а потом ещё память для локальных будет выделяться ?
Или же будет происходит обращение к участку памяти, который был выделен для глобальной переменной выше ?

Мне показалось всё быстрее работает когда используются просто ссылки через extern(или быстрее компилируется).
PM MAIL   Вверх
vinter
Дата 30.3.2008, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(inside_pointer @  30.3.2008,  02:57 Найти цитируемый пост)
Например есть файл, его считаем модулем, в нём определяем глобальную переменную, потом в этом файле(модуле) ссылаемся на неё через extern.

этого делать не надо, это бессмысленные действия

Цитата(inside_pointer @  30.3.2008,  02:57 Найти цитируемый пост)
Будет ли в таком случае эта глобальная переменная влиять на переменную с таким же именем, находящуюся в другом файле(другом модуле) ?

будет, глобальная видимость у всех связанных едениц трансляции одна.

Цитата(inside_pointer @  30.3.2008,  02:57 Найти цитируемый пост)
Имеет ли смысл использовать extern для создания отдельного модуля ?

шо?
Цитата(inside_pointer @  30.3.2008,  02:57 Найти цитируемый пост)
Глобальное пространство единое для всех файлов или разбито на части ?

единое
Цитата(inside_pointer @  30.3.2008,  02:57 Найти цитируемый пост)
Это что означает, что будет выделена память для глобальной переменной, а потом ещё память для локальных будет выделяться ?

каких локальных? в данном случае у тебя глобальная переменная, для которой в определенном месте выделяется память. Выделяется она 1 раз.


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 30.3.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



inside_pointer, тут уже говорили, что extern просто говорит компилятору: "переменная уже где-то определена, компилируй - остальное не твоя забота". Компилятор в итоге генерирует код: "... а в этом месте нужна переменная xxx ...". Линкер получает этот код и объединяет с остальными объектными файлами. Если переменная xxx только в одном из них найдена (определена), то все будет собрано, если не будет найдена, то возникнет ошибка "undefined reference", если будет найдено более одной переменной, то тоже возникнет ошибка, так как непонятно, которую из них использовать.
PM   Вверх
MAKCim
Дата 30.3.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  30.3.2008,  11:36 Найти цитируемый пост)
если будет найдено более одной переменной, то тоже возникнет ошибка, так как непонятно, которую из них использовать. 

гы
Код

/* a.c */

__attribute__((weak))
int a = 2;

int get1() {
    return a;
}

Код

/* b.c */

__attribute__((weak))
int a = 3;

int get2() {
    return a;
}

Код

/* main.c */
#include <stdio.h>

extern int get1();
extern int get2();

int main() {
    printf("%d\n", get1() + get2());
    return 0;
}

Код

# gcc a.c b.c main.c -o main
# ./main

вопрос, что будет выведено?  smile 


Это сообщение отредактировал(а) MAKCim - 30.3.2008, 13:02


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 30.3.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



MAKCim, ну static тоже можно заюзать и ошибки не будет. Но речь ведь не об этом, правильно?  smile 
PM   Вверх
MAKCim
Дата 30.3.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  30.3.2008,  13:06 Найти цитируемый пост)
ну static тоже можно заюзать и ошибки не будет. Но речь ведь не об этом, правильно?

так в том-то вся и фишка, что если использовать static, то все будет детерминировано и результат будет 5
в этом же случае нет и 
Цитата(bsa @  30.3.2008,  11:36 Найти цитируемый пост)
undefined reference

и однозначно определенного результата  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 30.3.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



MAKCim, ну и зачем оно нужно?  smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.