
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
21.06.2005, 14:58
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
Начал разбираться с С++ и возник такой вопрос: в "Справочном руководстве по C++" Б. Страуструпа в разделе R.3.3 написано: "Имена определяемых типов (typedef $$R.7.13)...не имеют внешнего связывания." Не могли б вы привести пример, из которого стало бы понятно, в чем это выражается? Хотелось бы увидеть что-то в духе "вот если написать вот так, то выскочит ошибка на этапе компиляции/компоновки файлов, а если бы имена определяемых типов (typedef) имели внешнее связывание, то такой ошибки не выскочило бы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 15:02
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
авторНачал разбираться с С++ Книги Страуструпа не лучшее средство, чтобы "начинать разбираться", а неприятности нужно переживать по мере их возникновения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 15:39
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
Книги Страуструпа не лучшее средство, чтобы "начинать разбираться", а неприятности нужно переживать по мере их возникновения. Вообще-то это спорное утверждение. А по сабжу что-нибудь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 15:58
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
typedef int iNt ; По-моему, имеется в виду, что имя которое порождает typedef (для примера iNt) в одном модуле не связывается с аналогичным именем в другом модуле. Можно написать в угодно в разных модулях объявлений typedef int iNt ;, но компоновщик ругаться не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 16:44
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
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. имеет внешнее связывание. Есть такой код: файл 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. файл 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. С учетом Можно написать в угодно в разных модулях объявлений typedef int iNt;, но компоновщик ругаться не будет. я предполагаю, что на описание имени cl в разных могулях компоновщик должен бы заругаться. А не ругается. Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 17:04
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
Повторяю: книги Страуструпа не лучшее средство, чтобы "начинать разбираться" и Вы это блестяще доказали. Единица компиляции обрабатывается независимо от других, если не указано обратное ссылками на другие ЕК. При компиляции компилятор распределяет память для типов, и если он находит определение типа в ЕК, то вопросов больше не задает. И не нужно пихать определения и объявления вместе, если не хотите лишних неприятностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 17:10
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
Bless я предполагаю, что на описание имени cl в разных могулях компоновщик должен бы заругаться. А не ругается. Почему? И не должен ругаться. Просто описание не заводит объекта в памяти. Мы только сообщаем компилятору, что бывает такой класс в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 17:27
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
И не должен ругаться. Просто описание не заводит объекта в памяти. Мы только сообщаем компилятору, что бывает такой класс в принципе. Хорошо. Почему тогда Страуструп подчернул, что имя класса имеет внешнее связываение, а typedef - внутреннее? В чем тогда между ними разница в вопросе связывания. В чем проявляется "внешнесть" имени класса и "внутреннесть" имени typedef? Не могли бы Вы продемонстрировать разницу на примере? В приведенном мной примере использование имени класса и имени typedef абсолютно идентично, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 17:36
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
BlessВ приведенном мной примере использование имени класса и имени typedef абсолютно идентично, имхо. С этим согласен. А данный тест, на который вы ссылаетесь, хоть он и по-русски написан, я в упор не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 17:42
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
ЗемлекопПросто описание не заводит объекта в памяти Даже описание класса со статическими членами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.06.2005, 17:56
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
С этим согласен. А данный тест, на который вы ссылаетесь, хоть он и по-русски написан, я в упор не понимаю. А что именно непонятно? В файле 7_1.cpp определен класс cl и имя-typedef td. А в файле 7_main в функции main() создано по одному объекту и того и другого и вызываются их функции-члены. Пример самый что ни на есть тестовый и создавался исключительно для того чтоб понять, в чем же разница в вопросах связывания между typedef-именем (которое имеет внутреннее связывание)и именем класса (которое имеет внешнее связывание)). Никакой особой смысловой нагрузки пример не несет. Как насчет В чем проявляется "внешнесть" имени класса и "внутреннесть" имени typedef? Не могли бы Вы продемонстрировать разницу на примере? ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2005, 13:05
|
|||
|---|---|---|---|
Вопрос по связыванию в С++ |
|||
|
#18+
Да потому что каждый модуль транслируется отдельно от других модулей. Собственно, это и написано у Страуструпа, что хоть двадцать раз объявляй один и тот же typedef, хоть одинаково, хоть по-разному - влиять это будет только на данный конкретный компилируемый модуль. Не думай об этом, пиши код лучше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2033102]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
57ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 331ms |

| 0 / 0 |
