crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в namespace
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Влад Дата 30.11.2011, 10:11
  И даже более того - даже если эту переменную объявить в хидере как статическую, в каждую единицу компиляции будет включен свой экземпляр переменной. Какие любопытные эффекты могут возникнуть оттого, что программист думает, что обращается к глобальной переменной x, а на самом деле обращается только к экземпляру, существующему только в данной единице компиляции - :unknw:
Iron Bug Дата 30.11.2011, 7:19
  потому что int x - это объявление переменной. а предварительная декларация - это extern int x.
переменные (не статические) нельзя объявлять в заголовочниках в принципе.
rp80 Дата 29.11.2011, 19:19
 
Цитата(sidsukana @ 29.11.2011, 17:53) *
1. Потому что x это глобальная переменная и она должна быть определена заранее.

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

Спасибо.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 12:59