Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: namespace
Форум на CrossPlatform.RU > Разработка > С\С++
rp80
a.h
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
namespace N
{
    static int x;
    void setX();
    int getX();
}


#endif // A_H_INCLUDED

a.cpp
#include "a.h"
   void N::setX()
   {
       x=25;
   }
  int N::getX()
   {
       return x;
   }


main
#include <iostream>
#include "a.h"
int main()
{
    N::x=300;
    N::setX();
    std::cout << N::x << N::getX()<<std::endl;
    return 0;
}


Если убираем static в a.h, получаем ошибку линковки multiple definition of `N::x'. Со статиком же компилится, линкуется и выводит 300 и 25.
Вопросы:
1. Почему ошибка без статик?
2. Почему 300 и 25?

Спасибо.
sidsukana
1. Потому что x это глобальная переменная и она должна быть определена заранее.

int main()
{
    int N::x=300;
    N::setX();
    std::cout << N::x << N::getX()<<std::endl;
    return 0;
}
rp80
Цитата(sidsukana @ 29.11.2011, 17:53) *
1. Потому что x это глобальная переменная и она должна быть определена заранее.

Ну что глобальная то да. Но мне кажется дело в другом. А именно, что линковщику кажется, что она определена 2 раза. Так как a.h заинклуден и в a.cpp и в main.cpp. А модификатор статик делает ее видимой только в файле a.h и поэтому линкуется нормально.
Мне больше непонятен вопрос 2.
Iron Bug
потому что int x - это объявление переменной. а предварительная декларация - это extern int x.
переменные (не статические) нельзя объявлять в заголовочниках в принципе.
Влад
И даже более того - даже если эту переменную объявить в хидере как статическую, в каждую единицу компиляции будет включен свой экземпляр переменной. Какие любопытные эффекты могут возникнуть оттого, что программист думает, что обращается к глобальной переменной x, а на самом деле обращается только к экземпляру, существующему только в данной единице компиляции - :unknw:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.