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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборка цели из нескольких объектных файлов 
:(
    Опции темы
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   Вверх
Страницы: (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.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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