Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ namespace

Автор: rp80 29.11.2011, 16:20

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 29.11.2011, 16:53

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

int main()
{
    int N::x=300;
    N::setX();
    std::cout << N::x << N::getX()<<std::endl;
    return 0;
}

Автор: rp80 29.11.2011, 19:19

Цитата(sidsukana @ 29.11.2011, 17:53) *
1. Потому что x это глобальная переменная и она должна быть определена заранее.

Ну что глобальная то да. Но мне кажется дело в другом. А именно, что линковщику кажется, что она определена 2 раза. Так как a.h заинклуден и в a.cpp и в main.cpp. А модификатор статик делает ее видимой только в файле a.h и поэтому линкуется нормально.
Мне больше непонятен вопрос 2.

Автор: Iron Bug 30.11.2011, 7:19

потому что int x - это объявление переменной. а предварительная декларация - это extern int x.
переменные (не статические) нельзя объявлять в заголовочниках в принципе.

Автор: Влад 30.11.2011, 10:11

И даже более того - даже если эту переменную объявить в хидере как статическую, в каждую единицу компиляции будет включен свой экземпляр переменной. Какие любопытные эффекты могут возникнуть оттого, что программист думает, что обращается к глобальной переменной x, а на самом деле обращается только к экземпляру, существующему только в данной единице компиляции - :unknw:

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)