![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
rp80 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
a.h
a.cpp
main
Если убираем static в a.h, получаем ошибку линковки multiple definition of `N::x'. Со статиком же компилится, линкуется и выводит 300 и 25. Вопросы: 1. Почему ошибка без статик? 2. Почему 300 и 25? Спасибо. |
|
|
sidsukana |
![]()
Сообщение
#2
|
Участник ![]() ![]() Группа: Участник Сообщений: 158 Регистрация: 23.12.2010 Из: Челябинск Пользователь №: 2296 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
1. Потому что x это глобальная переменная и она должна быть определена заранее.
|
|
|
rp80 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
1. Потому что x это глобальная переменная и она должна быть определена заранее. Ну что глобальная то да. Но мне кажется дело в другом. А именно, что линковщику кажется, что она определена 2 раза. Так как a.h заинклуден и в a.cpp и в main.cpp. А модификатор статик делает ее видимой только в файле a.h и поэтому линкуется нормально. Мне больше непонятен вопрос 2. |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
потому что int x - это объявление переменной. а предварительная декларация - это extern int x.
переменные (не статические) нельзя объявлять в заголовочниках в принципе. |
|
|
Влад |
![]()
Сообщение
#5
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
И даже более того - даже если эту переменную объявить в хидере как статическую, в каждую единицу компиляции будет включен свой экземпляр переменной. Какие любопытные эффекты могут возникнуть оттого, что программист думает, что обращается к глобальной переменной x, а на самом деле обращается только к экземпляру, существующему только в данной единице компиляции -
![]() |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.4.2025, 11:29 |