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