Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: статические переменные с втунренним связыванием  (Прочитано 6927 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dimaslviv
Участник

ua
Offline Offline

« : 11-04-2012 09:56 » 

Всем привет, читал как-то в Прата про внешнее и внутреннее связывание.
Он описывал что если взять 2 файла:
Код: (C++)
//file.h

int x=30;
//продолжение кода
и
Код: (C++)
//file2.h
#include "file1.h"

static int x=20;
//продолжение кода
Во втором файле переменная х во втором файле перекрывает переменную х с первого. И второй файл будет видить только свою х.
Но компилятор ругается на редефенишн..
Подскажите в чем ошибка.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-04-2012 10:02 » 

Компилятор прав. Используй в заголовках extern.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-04-2012 11:03 » 

Но компилятор ругается на редефенишн..

Зачем вообще понадобилось размещать определение
Код: (C++)
//file2.h
static int x=20;
в заголовочном файле?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
dimaslviv
Участник

ua
Offline Offline

« Ответ #3 : 11-04-2012 12:20 » 

RXL, при использовании extern int x во втором файле будет использоваться х с первого...

у меня желание реализовать тоже что и в книге. Чтоб можно было переопределять некоторые переменные

* staticVal.gif (116.24 Кб - загружено 839 раз.)
* 1.gif (17.05 Кб - загружено 1166 раз.)
« Последнее редактирование: 12-04-2012 15:32 от Джон » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 11-04-2012 12:52 » 

dimaslviv, я так думаю, там речь не про заголовочные файлы, а про .cpp, то бишь, про модули.
Если сделать в каждом .cpp по глобальной не-статической переменной с одинаковым именем, линковщик ругнётся на 2 экземпляра глобальных объектов с одинаковым именем. С функциями то же самое будет. Для того, чтобы всякая находящаяся в глобальном пространстве имён шелуха не учитывалась линковщиком, есть static для обозначения локальности имён, то есть, ограничения их использования одним модулем, запрета экспорта этих имён по умолчанию.
Записан
dimaslviv
Участник

ua
Offline Offline

« Ответ #5 : 11-04-2012 13:24 » 

Я разобрался в чем была проблема.
Просто оглашать переменные нужно было в .срр файлах которые подключают один .h файл

Код: (C++)
//file1.h

void f1();
void f2();

Код: (C++)
//file1_1.cpp
#include "stdafx.h"
#include "file1.h"

int x=2;
void f1(){printf("x=%d\n", x);}

Код: (C++)
//file1_2.cpp
#include "stdafx.h"
#include "file1.h"

static int x=3;
void f2(){printf("x=%d\n", x);}


при вызове обеих фукнкций:
Код: (C++)
//test.cpp
#include "stdafx.h"
#include "file1.h"

void main()
{
f1();
f2();
}


вывод будет:

х= 2
х= 3
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 11-04-2012 13:27 » 

dimaslviv, не понимаю манеру общаться картинками. Копипасть что ли...

1. int i;
Компилятор определяет имя "i" для текущего модуля и добавляет глобальный символ "i" в таблицу имен объектного файла.

2. extern int i
Компилятор определяет имя "i" для текущего модуля и добавляет ссылку на глобальный символ "i" в таблицу имен объектного файла.

3. static int i
Компилятор определяет имя "i" для текущего модуля и добавляет локальный символ "i" в таблицу имен объектного файла.

Дважды в модуле объявить один и тот же символ нельзя.
Исключение: вариант 2 + 1.
« Последнее редактирование: 11-04-2012 16:30 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-04-2012 15:37 » 

dimaslviv, ты бы, кстати, битмап в .png пожал, а то это жестоко по отношению к браузеру, дропбоксу и даже двухмегабитному каналу Улыбаюсь Пока выпилил картинку, оставив ссылку.
Записан
dimaslviv
Участник

ua
Offline Offline

« Ответ #8 : 12-04-2012 11:02 » 

Вад, щас исправлю
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 12-04-2012 15:33 » 

dimaslviv, будь внимательней, всё уже исправили за Вас.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines