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

Поиск:

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


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

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