Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по связыванию в С++ / 12 сообщений из 12, страница 1 из 1
21.06.2005, 14:58
    #33126885
Bless
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
Начал разбираться с С++ и возник такой вопрос:
в "Справочном руководстве по C++" Б. Страуструпа в разделе R.3.3 написано:

"Имена определяемых типов (typedef $$R.7.13)...не имеют внешнего связывания."

Не могли б вы привести пример, из которого стало бы понятно, в чем это выражается?
Хотелось бы увидеть что-то в духе
"вот если написать вот так, то выскочит ошибка на этапе компиляции/компоновки файлов,
а если бы имена определяемых типов (typedef) имели внешнее связывание,
то такой ошибки не выскочило бы".
...
Рейтинг: 0 / 0
21.06.2005, 15:02
    #33126892
MLeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
авторНачал разбираться с С++
Книги Страуструпа не лучшее средство, чтобы "начинать разбираться", а неприятности нужно переживать по мере их возникновения.
...
Рейтинг: 0 / 0
21.06.2005, 15:39
    #33127018
Bless
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
Книги Страуструпа не лучшее средство, чтобы "начинать разбираться", а неприятности нужно переживать по мере их возникновения.




Вообще-то это спорное утверждение.
А по сабжу что-нибудь?
...
Рейтинг: 0 / 0
21.06.2005, 15:58
    #33127084
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
typedef int iNt ;

По-моему, имеется в виду, что имя которое порождает typedef (для примера iNt) в одном модуле не связывается с аналогичным именем в другом модуле.

Можно написать в угодно в разных модулях объявлений typedef int iNt ;, но компоновщик ругаться не будет.
...
Рейтинг: 0 / 0
21.06.2005, 16:44
    #33127254
Bless
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
typedef int iNt;

По-моему, имеется в виду, что имя которое порождает typedef (для примера iNt) в одном модуле не связывается с аналогичным именем в другом модуле.

Можно написать в угодно в разных модулях объявлений typedef int iNt;, но компоновщик ругаться не будет.

Хорошо. В том же разделе написано следующее:

Имя с файловой областью видимости, которое явно описано как static, является локальным в своей единице трансляции и может использоваться для именования объектов, функций и т.п. в других единицах трансляции. Говорят, что такие имена имеют внутреннее связывание. Имя с файловой областью видимости, которое явно описано со спецификацией inline, является локальным в своей единице трансляции. Имя с файловой областью видимости, которое явно описано со спецификацией const и не описано явно как extern, считается локальным в своей единице трансляции. То же верно для имени класса, которое не использовалось в нелокальных для данной единицы трансляции описаниях объекта, функции или класса, и который не имеет статических членов ($$R.9.4), не имеет функций-членов, кроме подстановок ($$R.9.3.2). Всякое описание некоторого имени с файловой областью видимости, которое не описано одним из перечисленных способов так, чтобы иметь внутреннее связывание, в многофайловой программе обозначает один и тот же объект ($$R.3.7), функцию ($$R.8.2.5) или класс ($$R.9).Такие имена называются внешними или говорят, что они имеют внешнее связывание.

С учетом этой цитаты, имя cl, описанное как
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class cl{
public:
	int x;
	void f_cl();
};

void cl::f_cl(){
	cout<<"fcl"<<"   ";

имеет внешнее связывание.




Есть такой код:

файл 7_main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream.h>

typedef class{
 public:
	 int x; 
	 void f_td();
} td;

class cl{
public:
	int x;
	void f_cl();
};

int main (){
	cl c;
	td t;
	c.f_cl();
	t.f_td();
	return  0 ;

};

файл 7_1.cpp

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <iostream.h>
typedef class{
 public:
	 int x; 
	 void f_td();
} td;


class cl{
public:
	int x;
	void f_cl();
};

void td::f_td(){
	cout<<"typedef"<<'\n';
};

void cl::f_cl(){
	cout<<"fcl"<<"   ";
};



С учетом
Можно написать в угодно в разных модулях объявлений typedef int iNt;, но компоновщик ругаться не будет.


я предполагаю, что на описание имени cl в разных могулях компоновщик должен бы заругаться.
А не ругается. Почему?
...
Рейтинг: 0 / 0
21.06.2005, 17:04
    #33127323
MLeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
Повторяю: книги Страуструпа не лучшее средство, чтобы "начинать разбираться" и Вы это блестяще доказали.
Единица компиляции обрабатывается независимо от других, если не указано обратное ссылками на другие ЕК. При компиляции компилятор распределяет память для типов, и если он находит определение типа в ЕК, то вопросов больше не задает. И не нужно пихать определения и объявления вместе, если не хотите лишних неприятностей.
...
Рейтинг: 0 / 0
21.06.2005, 17:10
    #33127337
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
Bless
я предполагаю, что на описание имени cl в разных могулях компоновщик должен бы заругаться.
А не ругается. Почему?

И не должен ругаться. Просто описание не заводит объекта в памяти. Мы только сообщаем компилятору, что бывает такой класс в принципе.
...
Рейтинг: 0 / 0
21.06.2005, 17:27
    #33127395
Bless
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
И не должен ругаться. Просто описание не заводит объекта в памяти.
Мы только сообщаем компилятору, что бывает такой класс в принципе.



Хорошо.
Почему тогда Страуструп подчернул, что имя класса имеет внешнее связываение,
а typedef - внутреннее?

В чем тогда между ними разница в вопросе связывания.
В чем проявляется "внешнесть" имени класса и "внутреннесть" имени typedef?
Не могли бы Вы продемонстрировать разницу на примере?
В приведенном мной примере использование имени класса и имени typedef
абсолютно идентично, имхо.
...
Рейтинг: 0 / 0
21.06.2005, 17:36
    #33127419
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
BlessВ приведенном мной примере использование имени класса и имени typedef абсолютно идентично, имхо.

С этим согласен. А данный тест, на который вы ссылаетесь, хоть он и по-русски написан, я в упор не понимаю.
...
Рейтинг: 0 / 0
21.06.2005, 17:42
    #33127449
Bless
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
ЗемлекопПросто описание не заводит объекта в памяти


Даже описание класса со статическими членами?
...
Рейтинг: 0 / 0
21.06.2005, 17:56
    #33127489
Bless
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
С этим согласен. А данный тест, на который вы ссылаетесь, хоть он и по-русски написан, я в упор не понимаю.


А что именно непонятно? В файле 7_1.cpp определен класс cl и имя-typedef td.
А в файле 7_main в функции main() создано по одному объекту и того и другого и вызываются
их функции-члены.
Пример самый что ни на есть тестовый и создавался исключительно для того чтоб понять,
в чем же разница в вопросах связывания между typedef-именем
(которое имеет внутреннее связывание)и именем класса (которое имеет внешнее связывание)).
Никакой особой смысловой нагрузки пример не несет.

Как насчет

В чем проявляется "внешнесть" имени класса и "внутреннесть" имени typedef?
Не могли бы Вы продемонстрировать разницу на примере?

?
...
Рейтинг: 0 / 0
24.06.2005, 13:05
    #33133264
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по связыванию в С++
Да потому что каждый модуль транслируется отдельно от других модулей.
Собственно, это и написано у Страуструпа, что хоть двадцать раз объявляй один и тот же typedef, хоть одинаково, хоть по-разному - влиять это будет только на данный конкретный компилируемый модуль.

Не думай об этом, пиши код лучше...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по связыванию в С++ / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]