|
|
||||||||||||||||
[Задача] Объясните результат исполнения программы10.10.2011, 18:04. Показов 11965. Ответов 21
Метки задачи от evg (Все метки)
7
|
||||||||||||||||
| 10.10.2011, 18:04 | |
|
Ответы с готовыми решениями:
21
Объясните результат работы следующей программы
|
|
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
|
|
| 10.10.2011, 18:13 | |
|
а если порядок файлов в строке
g++ t1.cc t2.cc поменять?
0
|
|
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
| 10.10.2011, 18:35 | |
|
В Visual studio 2008 ошибка компиляции. Два раза написан метод get.
Или я не понял о чем вы?
0
|
|
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
|
||||||
| 10.10.2011, 19:21 | ||||||
|
Evg, и действительно, как это оно у Вас вообще скомпилировалось?
0
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 10.10.2011, 19:28 | ||||||
|
У меня тоже всё компилируется, и тоже выводит 20
Забавно. Причем если main перенести в другую единицу трансляции, ничего не меняется. И ещё вот параллельно возник такой вопрос (меняем только t1.сс:
0
|
||||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
|
|||||||
| 10.10.2011, 19:36 | |||||||
0
|
|||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 10.10.2011, 19:51 | |
|
Странно, когда перенёс x в public, один раз таки выдало 10...
Такое ощущение, что при вызове c.get() вызывается конструктор объекта класса из t2.cc
0
|
|
|
|
||||||||||||||
| 10.10.2011, 20:27 [ТС] | ||||||||||||||
Сообщение было отмечено как решение
РешениеДобавлено через 3 минуты Тест представляет собой сокращённый тестовый пример, об который конкретно споткнулись в реальной жизни: в программу локально включили описание класса, имя которого (и имя метода), как оказалось, совпало с уже существующим, но продвинутый gcc оказался бессилен с точки зрения диагностики ошибки. Вероятность таким образом вляпаться не такая уж и большая, но, как показала практика, она отлична от нуля Добавлено через 7 минут Упрощённый вариант двух файлов с той же выдачей:
3
|
||||||||||||||
|
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
|
|||||||
| 10.10.2011, 20:39 | |||||||
1
|
|||||||
|
|
|
| 11.10.2011, 10:43 [ТС] | |
Сообщение было отмечено как решение
Решениеобъяснение
Всё растёт из того, что стандарт Си++ требует того, чтобы inline-функции были multiply defined. Об этом я пояснял в Зачем нужен inline посты 6 и 11. Метод функции, описанный внутри тела класса, всегда является inline, даже если явно это не написано. gcc под системами с поддержкой elf'а реализует это свойство через weak-символы. В данном примере в первом файле мы имеем метод или функцию, определённую как weak, а во втором файле - метод или функцию с тем же манглированным именем, но уже честный global. Итого на линковке получается, что при разрешении ссылок global всегда перебивает weak
С нуля понять что такое weak несколько сложно, в своё время пояснял на более-менее живом примере: https://www.cyberforum.ru/cpp-... 46472.html Добавлено через 5 минут Как-то сумбурно пояснил, но для доходчивого пояснения надо рассказать про слишком многие вещи Добавлено через 4 минуты В догонку к пояснению
gcc через примерно такой же способ реализует шаблоны. Все шаблонные функции и переменные являются weak'ами, а потому когда они цепляются из инклюдов, то в каждом модуле получается функция с одним и тем же именем. Но за счёт weak'а на линковке отбрасывается всё, кроме одного экземпляра. А вот если есть специализация, то она строится как global, а потому перебивает все weak'и. И две специализации уже сделать нельзя, потому как два global'а уже конфликтуют друг с другом
Добавлено через 10 часов 25 минут Совсем забыл, что про inline я уже как-то рассказывал. См. Неочевидные ответы на простые вопросы раздел 7.2
14
|
|
|
Заблокирован
|
|
| 18.11.2011, 06:16 | |
|
Что-то уж очень противоречивое.
А как все это согласуется с тем, что любой объект в программе может быть определен только один раз. Здесь явно это правило нарушено.
0
|
|
|
|
||
| 22.11.2011, 13:38 [ТС] | ||
|
0
|
||
|
Заблокирован
|
|
| 22.11.2011, 18:22 | |
|
Ну уж не знаю, каким Вы компилятором пользуетесь, но я все таки не поленился перекопировал код Вашей так называемой ошибки и вот, что выдает VS2010
Ошибка 1 error LNK2005: "public: int __thiscall C::get(void)" (?get@C@@QAEHXZ) уже определен в c22.obj c:\Users\...\documents\visual studio 2010\Projects\ErrProj\ErrProj\ErrProj.ob j Ошибка 2 error LNK1169: обнаружен многократно определенный символ - один или более c:\users\...\documents\visual studio 2010\Projects\ErrProj\Debug\ErrProj.exe 1 Так что никакаяя это не трудноуловимая ошибка, а сечется компилятором влегкую.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 22.11.2011, 19:10 | |
|
0
|
|
|
Заблокирован
|
|
| 22.11.2011, 19:20 | |
|
Ну хорошо, Вы уж извините великодушно.
Но все же ради интереса укажите тот ущербный компилятор, который такую лажу не просекает.
0
|
|
|
Заблокирован
|
|
| 22.11.2011, 23:54 | |
|
Да Вы знаете, я так всего то с C++ знаком где-то месяц.
Конечно, еще разбираюсь слабо. Вы уж так строго не судите новичка. А что в теме написано, я вот так это и понял, как пишу.
0
|
|
|
|
|
| 23.11.2011, 10:43 [ТС] | |
|
Пока сентенция сводится к тому, что виндузовые компиляторы ругаются на линковке, а юниксовые - нет. Потому что там и там используются разный формат исполняемого файла, и под виндой, где используется более ущербный формат, не проходят такие финты ушами, которые возможны под юниксом.
Ну и так, для общего сведения. "g++" - это имя компилятора
1
|
|
| 28.11.2011, 01:16 | ||
|
пока мне кажется все это раздражением при попытке завинтить шуруп с прямым шлицом крестообразной отверткой. формат то ли отвертки, то ли шурупа - определенно ущербный. об обобщении "виндузовые компиляторы". недавно было решено старый проект, сделанный под nt vs6 (mfc) развивать дальше ("ведь он уже есть, и успешно работает", почему не использовать оттуда куски, такой франкенштейн создать, и к нему осовремененного добавить, и будет хорошо). на то, чтобы сделать его компилируемым под vs2010, двое пахали одну неделю. потом еще столько же ушло на то, чтобы оно снова заработало. и бой продолжается. постепенно отрезаются омертвевшие части, заменяются новыми. затраты уже, по-моему, превысили затраты на новую разработку. а "всего лишь другой компилятор". и тоже виндоузовый.
0
|
||
|
|
|||||
| 28.11.2011, 11:03 [ТС] | |||||
|
0
|
|||||
| 28.11.2011, 11:03 | |
|
Помогаю со студенческими работами здесь
20
Объясните разницу во времени исполнения кода Результат исполнения функции Найти результат исполнения кода Как в C++ получить результат исполнения внешней команды В каком регистре будет находиться результат исполнения оператора add ax, bx Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|