реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Использование extern в нескольких файлах
ViKo
сообщение Jan 24 2012, 11:50
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(XVR @ Jan 24 2012, 13:52) *
Стандарт С (99), глава 6.6.6: Linkages of identifiers

Попытался перевести и понять, что там написано.
П. 5 описывает функции, там другие правила.
Единственное, что подходит - Each declaration of an identifier with no linkage denotes a unique entity.
Но разве из этого следует, что эти уникальные объекты останутся уникальными, если они определены в разных файлах одной программы?
Вот добавляем мы квалификатор static к определению переменной, чтобы ограничить ее видимость в пределах файла. Значит, без static она видна везде? Как же разруливать 2 одинаковых переменных?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 24 2012, 12:00
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ViKo @ Jan 24 2012, 15:50) *
Но разве из этого следует, что эти уникальные объекты останутся уникальными, если они определены в разных файлах одной программы?

Где-то там, в п.6.2.2 стандарта есть фраза, что если не указано иное, то "по-умолчанию" - extern. T.е указан extern явно, или не указано ничего, то это тоже extern, а значит - один и тот же объект.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 24 2012, 12:02
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



По умолчанию в Си переменные имеют внешнее связывание, в Си++ -- внутреннее.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 24 2012, 14:18
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ViKo @ Jan 24 2012, 15:50) *
Единственное, что подходит - Each declaration of an identifier with no linkage denotes a unique entity.
Но разве из этого следует, что эти уникальные объекты останутся уникальными, если они определены в разных файлах одной программы?
Они будут уникальными по именам для всей программы, в скольких бы модулях их не описали.
Вот -
Цитата
In the set of translation units and libraries that constitutes an entire program,

Что можно перевести как 'в наборе единиц компиляции и библиотек, который является всей программой'

Цитата
П. 5 описывает функции, там другие правила.
Во 2м предложении оттуда речь идет уже о переменных (я немного не то предложение выделил)

Цитата
Вот добавляем мы квалификатор static к определению переменной, чтобы ограничить ее видимость в пределах файла. Значит, без static она видна везде?
Да
Цитата
Как же разруливать 2 одинаковых переменных?
Их объединит линкер (если они обе не инициализированные), или получите слом на линковке
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 24 2012, 15:49
Сообщение #20


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (andrew_b @ Jan 24 2012, 19:02) *
По умолчанию в Си переменные имеют внешнее связывание, в Си++ -- внутреннее.

Константы, вы хотели сказать?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 25 2012, 04:36
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Нет, переменные. И функции тоже. Про константы утверждать не буду, но скорее всего, тоже.
Go to the top of the page
 
+Quote Post
am1808
сообщение Feb 3 2012, 10:11
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



Цитата(andrew_b @ Jan 25 2012, 08:36) *
Нет, переменные. И функции тоже. Про константы утверждать не буду, но скорее всего, тоже.


ключевое слово const ( а также typedef ) дает имени внутреннее связывание.

при использовании имен без headers, например, в файле 1.с

const int a = 5;
то a имеет внутреннее связывание.

для того, чтобы а имела внешнее связывание, нужно

в файле 1.с

объявить a как extern;
Код
extern const int a; //  переменная a теперь будет иметь внешнее связывание


и определить переменную:
Код
const int a = 777; // определяем a


теперь, для использования a в других единицах трансляции нужно просто объявить переменную

файл 2.с:

Код
extern const int a; // далее, можем использовать a



тоже самое достигается путем headera

теперь,
если же мы определяем в header что-то типа:

const int b = 10;

и включаем это header в различные единицы трансляции,
то в каждой единице трансляции создается своя локальная копия b

Сообщение отредактировал am1808 - Feb 3 2012, 10:13
Go to the top of the page
 
+Quote Post
Marto
сообщение Feb 14 2012, 05:42
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190



XVR,
а мне помнится, что во исходном файле глобальная переменная объявляется как обычном, а во всех остальных со спецификатором extern. где-то валялась книжка по стандарту C99.
Да и gcc для авр не позволял делать так, как вы описали.


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 14 2012, 08:18
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Marto @ Feb 14 2012, 09:42) *
а мне помнится, что во исходном файле глобальная переменная объявляется как обычном, а во всех остальных со спецификатором extern.
И это правильно laughing.gif
Цитата
где-то валялась книжка по стандарту C99.
Но стандарт не запрещает написать переменную многократно и без extern (IMHO из соображений совместимости - во времена K&R это была обычная практика)

Цитата
Да и gcc для авр не позволял делать так, как вы описали.
А x86 позволил
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 08:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016