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

start [/forum/topic.php?fid=57&msg=33127395&tid=2033102]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 420ms |

| 0 / 0 |
