Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборка цели из нескольких объектных файлов 
:(
    Опции темы
EnergoHokum
Дата 6.12.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Такой вопрос: есть, к примеру, файлы first.cpp, first.h, second.cpp, second.h.
Из них собираются объектные файлы соответственно first.o и second.o, которые после слинковываются в одну библиотеку.
В second.h объявлена переменная, которая используется как в first.cpp, так и в second.cpp. Соответственно, second.h включен и в first.cpp, и в second.cpp. При линковке компилятор ругается на то, что в обоих *.o файлах объявление этой переменной дублируется. Правильно ли будет задать ей модификатор static, или есть "более другие" методы решения этой проблемы?
PM MAIL ICQ   Вверх
MAKCim
Дата 6.12.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



EnergoHokum, 
в second.h
переменная должна быть объявлена с модификатором extern
а определена в одном из .cpp-файлов
Цитата(EnergoHokum @  6.12.2007,  09:49 Найти цитируемый пост)
Правильно ли будет задать ей модификатор static, или есть "более другие" методы решения этой проблемы? 

неправильно, если переменная должна быть глобальной для всех модулей
если ее определить как static, то в каждом модуле будет свой локальный экземпляр переменной
Код

// second.h
...
extern int variable;
...

Код

// variable.cpp

int variable = 1; // определение

Код

// first.cpp

#include "first.h"
#include "second.h"
...

Код

// second.cpp

#include "second.h"
...


Это сообщение отредактировал(а) MAKCim - 6.12.2007, 10:12


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
EnergoHokum
Дата 6.12.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Хм, когда переопределил с extern, пошла ругань вида: ...undefined reference to.... Эту переменную нужно инициализировать в соответствующем *.cpp, или всё равно где?

Это сообщение отредактировал(а) EnergoHokum - 6.12.2007, 10:15
PM MAIL ICQ   Вверх
MAKCim
Дата 6.12.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



EnergoHokum, 
я же пример написал специально
Цитата(EnergoHokum @  6.12.2007,  10:15 Найти цитируемый пост)
Эту переменную нужно инициализировать в соответствующем *.cpp, или всё равно где?

все равно, главное должно быть где-то определение (но не в .h-файле естественно)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
EnergoHokum
Дата 6.12.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



В общем, упрощённо ситуация такая:
Код

//main.cpp
#include <iostream>
#include "./second.h"
#include "./main.h"

int first(void)
{
    std::cout<<"imain+500="<<(imain+=500)<<std::endl;
    std::cout<<"main.cpp -> first()"<<std::endl;
    return 0;
}

int main(int argc,char** argv)
{
    second();
    return 0;
}

Код

//main.h
#ifndef MAIN_H_20071205_1945
#define MAIN_H_20071205_1945

int imain;
char* chmain;

int first(void);

#endif

Код

//second.cpp
#include <string.h>
#include <iostream>
#include "./second.h"
#include "./main.h"

int second(void)
{
    imain=555;
    std::cout<<"imain="<<imain<<std::endl;
    std::cout<<"second.cpp -> second(), \
call main.cpp -> first()\n"<<std::endl;
    first();
    chmain=new char[strlen("test string of second")+1];
    memcpy(chmain,"test string of second",strlen("test string of second")+1);
    std::cout<<"chmain is "<<chmain<<std::endl;
    return 0;
}

Код

//second.h
#ifndef SECOND_H_20071205_1950
#define SECOND_H_20071205_1950

int second(void);

#endif

Код

REMOVE = rm -f
EXEC = a
FIRST = main
SECOND = second
SOURCE = $(FIRST).cpp $(SECOND).cpp
HEADER = $(FIRST).h $(SECOND).h
OBJECT = $(FIRST).o $(SECOND).o

$(EXEC): $(OBJECT)
    g++ -o $(EXEC) $(OBJECT)

$(OBJECT): $(SOURCE) $(HEADER)
    g++ -c $(SOURCE)

clean:
    $(REMOVE) $(wildcard *.o)
    $(REMOVE) $(wildcard *.exe)
    $(REMOVE) $(EXEC)

all:
    $(MAKE) $(EXEC)

ALL: clean all


Действительно, при объявлении переменных со static для каждого .o-файла они получаются свои, но и с extern тоже ничего хорошего не выходит.
PM MAIL ICQ   Вверх
t_gran
Дата 6.12.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 1
Всего: 37



Предлагаю так:

Код

// second.h

#ifndef __SECOND_H__
#define __SECOND_H__

int variable;

#endif




--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
MAKCim
Дата 6.12.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

//main.h
#ifndef MAIN_H_20071205_1945
#define MAIN_H_20071205_1945

extern int imain;
extern char* chmain;

extern int first(void);

#endif

Код

// global.cpp

int imain;
char * chmain;

Код

REMOVE = rm -f
EXEC = a
FIRST = main
SECOND = second
SOURCE = $(FIRST).cpp $(SECOND).cpp global.cpp
HEADER = $(FIRST).h $(SECOND).h
OBJECT = $(FIRST).o $(SECOND).o global.o
$(EXEC): $(OBJECT)
    g++ -o $(EXEC) $(OBJECT)
$(OBJECT): $(SOURCE) $(HEADER)
    g++ -c $(SOURCE)
clean:
    $(REMOVE) $(wildcard *.o)
    $(REMOVE) $(wildcard *.exe)
    $(REMOVE) $(EXEC)
all:
    $(MAKE) $(EXEC)
ALL: clean all



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
EnergoHokum
Дата 6.12.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Мне нужно, чтобы переменные оставались там, где они лежат сейчас, по контексту они так привязаны. Можно (наверное) вообще сгрести их все в один .h-файл, но это не решение. Это здесь два объектника, а в проекте их больше. Перетряхивать всю структуру проекта? Это практически невозможно.

Это сообщение отредактировал(а) EnergoHokum - 6.12.2007, 10:53
PM MAIL ICQ   Вверх
MAKCim
Дата 6.12.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(EnergoHokum @  6.12.2007,  10:50 Найти цитируемый пост)
Мне нужно, чтобы переменные оставались там, ult они лежат сейчас, по контексту они так привязаны. Можно (наверное) вообще сгрести их все в один .h-файл, но это не решение. 

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

Это сообщение отредактировал(а) MAKCim - 6.12.2007, 10:56


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 6.12.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



MAKCim, а зачем 
Код
extern int first(void);
?

и оффтопный вопрос. где-то слышал, что static (не в функциях) делать не рекомендуется. почему, не подскажешь?


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 6.12.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alek86 @  6.12.2007,  10:58 Найти цитируемый пост)
а зачем 

имхо, так наглядней
Цитата(Alek86 @  6.12.2007,  10:58 Найти цитируемый пост)
и оффтопный вопрос. где-то слышал, что static (не в функциях) делать не рекомендуется. почему, не подскажешь? 

если речь о С++, то там есть анонимные пространства имен, которые заменяют static


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
EnergoHokum
Дата 6.12.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Ви будете смеяться, но таки ничего не изменилось! Или это я уже туплю?
Да, действительно, туплю. Но всё равно как-то неизящно выходит. Счас поковыряюсь ещё, может, что и придумается...

Это сообщение отредактировал(а) EnergoHokum - 6.12.2007, 11:08
PM MAIL ICQ   Вверх
MAKCim
Дата 6.12.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(EnergoHokum @  6.12.2007,  11:06 Найти цитируемый пост)
Ви будете смеяться, но таки ничего не изменилось! Или это я уже туплю? 

global.cpp создал?
поместил туда определение символов?
добавил в Makefile global.cpp и global.o


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 6.12.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(MAKCim @  6.12.2007,  11:05 Найти цитируемый пост)
если речь о С++, то там есть анонимные пространства имен, которые заменяют static

это и есть причина для устранения? жестко....


--------------------
user posted image    user posted image
PM MAIL   Вверх
Random13
Дата 6.12.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @ 6.12.2007,  10:55)
в .h-файле не должно быть не static-определений

А разве статик не должны быть тоже определены в срр файле ?
В h файле только, вроде, объявление идет, а память должна выделятся в срр ?

Как я понимаю, в одном файле h глобальная переменная должна быть объявлена без extern, этот файл должен быть подключен к срр, где ей отводится память, в остальных  h файлах должно стоять extern.
Разве только для static - extern бесполезно делать ее видимость все равно ограничивается файлом.

Это сообщение отредактировал(а) Random13 - 6.12.2007, 11:34
PM MAIL   Вверх
EnergoHokum
Дата 6.12.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Да, порядок, завелось, пропустил в Makefile одно вхождение. Но некрасиво!!! Некрасиво. Нужно сделать лучше. Буду пробовать.
PM MAIL ICQ   Вверх
MAKCim
Дата 6.12.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Random13 @  6.12.2007,  11:29 Найти цитируемый пост)
А разве статик не должны быть тоже определены в срр файле ?
В h файле только, вроде, объявление едет, а память должна выделятся в срр ? 

static-определение может быть в .h-файле
например, если в каждом .cpp-файле, куда подключается .h-файл, должны быть локальные копии данных, которые определены как static в .h-файле

Добавлено через 1 минуту и 11 секунд
Цитата(EnergoHokum @  6.12.2007,  11:30 Найти цитируемый пост)
Да, порядок, завелось, пропустил в Makefile одно вхождение. Но некрасиво!!! Некрасиво. Нужно сделать лучше. Буду пробовать. 

это не некрасиво, а правильно  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Random13
Дата 6.12.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @ 6.12.2007,  11:32)
static-определение может быть в .h-файле
например, если в каждом .cpp-файле, куда подключается .h-файл, должны быть локальные копии данных, которые определены как static в .h-файле

Ну если в каждом cpp файле идет просто копия, то в h файле не определение, а объявление переменной, память таки ей выделяется в срр. И в каждом срр ее нужно будет определить как глобальную, и при желании инициализировать...Я так понимаю...
Что, в общем, можно сделать и без этих хлопот с h файлом...

Добавлено через 8 минут и 20 секунд
Хотя тут опять же возникает вопрос, если я эту переменную в h файле использую, скажем в inline функции, а память выделил в нескольких срр файлах и хедэр файл ко всем к ним подключается, то какая переменная будет тогда использоваться в этой функции ?  smile 

Это сообщение отредактировал(а) Random13 - 6.12.2007, 11:42
PM MAIL   Вверх
MAKCim
Дата 6.12.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Random13 @  6.12.2007,  11:39 Найти цитируемый пост)
Что, в общем, можно сделать и без этих хлопот с h файлом...

зачем лишние телодвижения, если есть .h-файлы?  smile 
Цитата(Random13 @  6.12.2007,  11:39 Найти цитируемый пост)
Хотя тут опять же возникает вопрос, если я эту переменную в h файле использую, скажем в inline функции, а память выделил в нескольких срр файлах и хедэр файл ко всем к ним подключается, то какая переменная будет тогда использоваться в этой функции ?

пример кода можно?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Random13
Дата 6.12.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @ 6.12.2007,  12:54)
зачем лишние телодвижения, если есть .h-файлы?  smile 

Для чего тут нужно объявление статической глобальной не совсем понятно, если в каждом срр ее нужно опять писать и инициализировать.
Скорее всего для наглядности в хедер файле объявление - что мол такая переменная тут есть, обычно же каждому срр соответствует один хедер с объявлениями.

Пример кода напишу, как освобожусь, я тут занят чуток - застрял на какой-то обидной плюхе не понятно в чем ошибка...

Это сообщение отредактировал(а) Random13 - 6.12.2007, 15:52
PM MAIL   Вверх
Random13
Дата 6.12.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



В общем в моем понимании хэдер файлы в проекте С++, в основном используют, как краткую ссылку на то, что же там есть в срр и для связи данного срр с остальным проектом.
Так, как область видимости статической переменной ограничена самим файлом срр, то о связи с проектом речь тут не идет, скорее для наглядности. А так объявление ее в хедэр ни на что не влияет - постирать эти объявления из h файлов и ничего не изменится...

Это сообщение отредактировал(а) Random13 - 6.12.2007, 16:27
PM MAIL   Вверх
zkv
Дата 6.12.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Random13, почитай Страуструпа про единицы трансляции, там предельно ясно раскрывается суть .h файлов
Цитата(MAKCim @  6.12.2007,  10:55 Найти цитируемый пост)
в .h-файле не должно быть не static-определений

а константы?
PM MAIL   Вверх
bsa
Дата 6.12.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Random13 @ 6.12.2007,  11:29)
А разве статик не должны быть тоже определены в срр файле ?
В h файле только, вроде, объявление идет, а память должна выделятся в срр ?
Ты путаешь глобальные статические переменные и статические члены классов. Члены классов надо определять где-то, а переменные нет: static int x; - это уже определение.
Цитата(Random13 @ 6.12.2007,  11:29)
Как я понимаю, в одном файле h глобальная переменная должна быть объявлена без extern, этот файл должен быть подключен к срр, где ей отводится память, в остальных  h файлах должно стоять extern.
Глобальная переменная должна объявляться в .h файле с extern. И только в одном *.c или *.cpp файле она должна быть определена (т.е. без extern).
PM   Вверх
MAKCim
Дата 6.12.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(zkv @  6.12.2007,  16:22 Найти цитируемый пост)
а константы? 

а проверить?  smile 



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zkv
Дата 6.12.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(MAKCim @  6.12.2007,  21:37 Найти цитируемый пост)
а проверить? 

да пожалуйста, пример ниже в VC++8 работает. 
У Страуструпа есть обоснование, типа глобальные константные переменные не экспортируются
Код

//test.h
#pragma once

const int g_constVar = 0;//если конст убрать - получим ошибку компоновщика, а так - все ок
Код

//test.cpp
#include "test.h"

int g_var = g_constVar + 1;

Код

//main.cpp
#include <iostream>
#include "test.h"

extern int g_var;

int main()
{
    std::cout<<"g_var = "<<g_var<<" g_constVar = "<<g_constVar;
    std::cin.get();
}


Это сообщение отредактировал(а) zkv - 6.12.2007, 21:59
PM MAIL   Вверх
MAKCim
Дата 6.12.2007, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



zkv, 
в С не прокатит
в С++ возможно (если уж Страуструп пишет  smile )


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zkv
Дата 6.12.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(MAKCim @  6.12.2007,  22:10 Найти цитируемый пост)
в С++ возможно (если уж Страуструп пишет

доберусь до книги уточню  smile 
PM MAIL   Вверх
SergeCpp
Дата 7.12.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Код
// buzz.h

const int g_buzz = 1;

const int* ptr_buzz_a();
const int* ptr_buzz_b();

// a.cpp

const int* ptr_buzz_a()
{
    return &g_buzz;
}

// b.cpp

const int* ptr_buzz_b()
{
    return &g_buzz;
}

// main.cpp

if( ptr_buzz_a() != ptr_buzz_b() )
{
    MessageBox( NULL, "Buzz", "Buzz", MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL );
}
Одна (логически) переменная — одна (зачем тратить) область памяти — один (может сравниваться где-нибудь) указатель

Тут пример простой, но можно ведь и несколько const-переменных (объектов), которые могут вставляться в список, сравниваться посредством указателя (для объектов) и т.д.

Использовать-то можно, конечно же, учитывая, что одна (логически) переменная превращается при таком использовании в несколько физических областей памяти

PM MAIL WWW ICQ   Вверх
MAKCim
Дата 7.12.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



SergeCpp, 
const-переменные на то и const-переменные, чтобы их использовать только по значению, которое подставляется компилятором в виде непосредственного операнда инструкций
имхо, все остальные варианты использования ошибочны


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 7.12.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



MAKCim, ты хочешь сказать, что код:
Код
const std::string text("some text");
...
std::string my_text(text);
...
В корне не верен? (прошу не ругать за использование классов в этом примере)
PM   Вверх
MAKCim
Дата 7.12.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



bsa, 
я про классы и прочие сложные типы не говорил  smile 



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 7.12.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Я имел в виду, что можно передавать по константной ссылке или указателю.
PM   Вверх
archimed7592
Дата 8.12.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



MAKCim, я имею немного иное мнение о спектре применения const переменных. Даже примитивных типов. Если я не изменяю в ф-ции переменную, то я объявляю её const. Привычка. Зато через месяц такие исходники читать проще.


zkv, я точно не уверен, ибо Стандарт знаю не на зубок, но из того, что описано в п. 3.2(ODR) следует, что для констант(даже примитивных типов) никаких исключений в этом плане нет.

Добавлено через 5 минут и 10 секунд
Собственно говоря, студия нарушает стандарт, т.к. такой код:
Код
// m2.cpp
const int g_constVar = 0;

int g_var = g_constVar + 1;
const int *g_pConstVar = &g_constVar;

/* -------------------------------------------------------------------------------------------------------*/
// main.cpp
#include <ostream>
#include <iostream>

const int g_constVar = 0;

extern int g_var;
extern const int *g_pConstVar;

int main()
{
    std::cout << g_constVar << std::endl;
    std::cout << g_var << std::endl;
    std::cout << g_pConstVar << std::endl;
    std::cout << &g_constVar << std::endl;

    return 0;
}

Выводит на экран следующее:
Код
0
1
00415800
004157FC

Т.е. адреса у одной и той же переменной разные, что противоречит 3.2/3:
Цитата
Every program shall contain exactly one definition of every non-inline function or object that is used in that
program;
 no diagnostic required. The definition can appear explicitly in the program, it can be found in the
standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8).
An inline function shall be defined in every translation unit in which it is used.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Random13
Дата 8.12.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(zkv @ 6.12.2007,  21:57)
Код

//test.h
#pragma once

const int g_constVar = 0;//если конст убрать - получим ошибку компоновщика, а так - все ок
[code=cpp]

Но конст переменные - это по сути тот же дэфайн, где-то, кстати читал, что использования конст переменных предпочтительнее дэфайна, по возможности, правда уже не помню почему.

Тут я подзабыл, и неправильно немного написал до этого. Вообще получается, что в h файлах глобальные переменные, кроме статических ни объявлять ни определять нельзя. По сути при компиляции тело h файла переписывается в срр файл на месте, где стоит инклюд, и поэтому если мы напишем в h файле, например int a;, и подключим его к main.cpp и a.cpp, то будет ошибка компоновки redifinition. Так как этот файл перепишется 2 раза и будет попытка создания 2-х глобальных переменных с одним именем. Так видимо и происходит при static, просто в этом случае в каждом срр файле создается своя копия переменной, как и в случпе с const, просто видать так как - это const - то компилятор забивает на эту ошибку.

То есть глобальную переменную можно определить в срр файле, а в остальных файлах писать extern, можно и в h файле, но при этом подключить его можно только один раз к срр файлу, (понятно можно a.h подключить к b.h, и потом в b.cpp подключить a.h и b.h, так как в этом случае, если стоит #ifndef файл просто не подключится второй раз  smile, я говорю о случае раздельной компиляции, при подключении к нескольким срр...)
PM MAIL   Вверх
UnrealMan
Дата 8.12.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  8.12.2007,  15:50 Найти цитируемый пост)
Т.е. адреса у одной и той же переменной разные, что противоречит 3.2/3

Ты упустил один маленький момент: это не одна и та же переменная smile

Цитата(3.5 Program and linkage)
Objects declared const and not explicitly declared extern have internal linkage.


Добавлено через 2 минуты и 42 секунды
Цитата(Random13 @  8.12.2007,  18:47 Найти цитируемый пост)
Вообще получается, что в h файлах глобальные переменные, кроме статических ни объявлять ни определять нельзя. 

Объявлять-таки можно.

Это сообщение отредактировал(а) UnrealMan - 8.12.2007, 18:57
PM MAIL   Вверх
Random13
Дата 8.12.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(UnrealMan @ 8.12.2007,  18:56)
Объявлять-таки можно.

Всмысле как написать в h файле ?

Ну если написать с extern - то да - можно.

Это сообщение отредактировал(а) Random13 - 8.12.2007, 20:27
PM MAIL   Вверх
UnrealMan
Дата 8.12.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Random13 @  8.12.2007,  20:24 Найти цитируемый пост)
Всмысле как написать в h файле ?

Да какая разница где? Впрочем, по твоим постам видно, что ты не понимаешь, зачем нужны h-файлы.

Цитата(Random13 @  8.12.2007,  20:24 Найти цитируемый пост)
Ну если написать с extern - то да - можно.

А без extern это будет определение, а не просто объявление.

Это сообщение отредактировал(а) UnrealMan - 8.12.2007, 21:07
PM MAIL   Вверх
Random13
Дата 9.12.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



У меня у самого такое ощущение, что, чем больше знаю - тем меньше понимаю...

Это сообщение отредактировал(а) Random13 - 9.12.2007, 13:40
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1041 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.