Черная дыра

Основные разделы => Разное => Тема начата: Feol от 20.04.2011 16:32:59

Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 20.04.2011 16:32:59
Вопрос любителям языка программирования C++

В чём смысл возможности откомпилировать в MSVC 2005, 2010 (в других средах не проверял) сей очень сильно странный код :D:

class CClass
{
 //...
};
//...
CClass Obj1;
CClass Obj2;
 
Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!
 
Obj1.~Obj2(); // !! :)
Obj2.~Obj1(); // !! :)
 
CClass *pObj1 = &Obj1;
CClass *pObj2 = &Obj2;
 
pObj1->~Obj1(); // !!
pObj2->~Obj2(); // !!
 
pObj1->~Obj2(); // !! :)
pObj2->~Obj1(); // !! :)

Фактически вызывается деструктор CClass с правильным указателем this (соотв. имени объекта).
Название: OFF C++: Очень сильно странный код :)
Отправлено: Sigmoid от 20.04.2011 18:18:03
Извращения какие-то.
Это точно С++, не С#? С точки зрения С++, какой-то бред.
Название: OFF C++: Очень сильно странный код :)
Отправлено: Виктор Левашов от 20.04.2011 18:24:18
ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Название: OFF C++: Очень сильно странный код :)
Отправлено: LRV_75 от 20.04.2011 19:25:21
Цитировать
ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Конечно есть, С Шарп называют, только листинг вверху это не C#
Название: OFF C++: Очень сильно странный код :)
Отправлено: Виктор Левашов от 20.04.2011 19:53:54
Цитировать
Цитировать
ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Конечно есть, С Шарп называют, только листинг вверху это не C#
С Шарп? А пишется С Диез.  :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: LRV_75 от 20.04.2011 20:08:25
ЦитироватьА пишется С Диез.  :)
Так и есть, потому что sharp  :wink:  :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: Sigmoid от 20.04.2011 23:22:25
Я Шарп практически не знаю (так, книжки в свое время полистывал) но это точно не с++.

class CClass
{
//...
};
//...
CClass Obj1;
CClass Obj2;

Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!

Obj1 и Obj2 - это экземпляры класса (а не классы), откуда взялись деструкторы  ~Obj1() и ~Obj2()?  Деструктор CClass должен быть ~CClass.
Кстати, в С++ вообще крайне не рекомендуется вызывать в явном виде деструктор.  

Короче, то ли лыжи не едут, то ли я.... недостатоточно хорошо знаю С++ :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: Виктор Левашов от 21.04.2011 13:36:06
А может это вообще чья-то шутка была. А мы тут голову ломаем.
Название: OFF C++: Очень сильно странный код :)
Отправлено: LRV_75 от 21.04.2011 13:40:05
ЦитироватьА может это вообще чья-то шутка была. А мы тут голову ломаем.
Наверно, и вообще, что такое MSVC?
Название: OFF C++: Очень сильно странный код :)
Отправлено: Parf от 21.04.2011 12:59:22
Стандартам языка сей код явно не соответствует. Да и здравому смыслу тоже, ибо в области видимости внутри Obj1 Obj2 находиться не должен. Но в MSVC много странных приблуд... GCC пробовали откомпилироваь?

Хотя... что там внутри CClass написано? Obj1 и Obj2 точно не упоминаются?
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 21.04.2011 13:59:54
ЦитироватьЯ Шарп практически не знаю (так, книжки в свое время полистывал) но это точно не с++.

class CClass
{
//...
};
//...
CClass Obj1;
CClass Obj2;

Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!

Obj1 и Obj2 - это экземпляры класса (а не классы), откуда взялись деструкторы  ~Obj1() и ~Obj2()?  Деструктор CClass должен быть ~CClass.
Кстати, в С++ вообще крайне не рекомендуется вызывать в явном виде деструктор.  

Короче, то ли лыжи не едут, то ли я.... недостатоточно хорошо знаю С++ :)
Я позавчера случайно написал такое на работе (опечатка copy/paste :) ) и в ужасе обнаружил, что оно компилируется Майкрософтом :D . А gcc не компилирует этот бред :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: boez от 21.04.2011 14:02:47
Может это такой глюк МСВС? В gcc не прокатывает, говорит
main.cpp:21: error: expected class-name before '(' token
Ну и т.д.

А может это тест на то, сколько человек полезут компилить и проверять? :)

P.S. Во! Ссылка: http://www.dinkumware.com/exam/

Можно выбрать компилятор и протестить как он скушает кусок кода. И действительно, VC++ успешно кушает приведенный кусок! mingw (gcc) ессно справедливо ругается. я так понимаю, Майкрософт как всегда по-своему понимает стандарты :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 21.04.2011 14:18:45
Похоже, или устойчивая бага из версии в версию, или особенность внутренней логики компиляторов MS, которую не сочли нужным скрывать, или им зачем-то это нужно у себя. Ни в каких исходниках, поставляемых с MSVC 2005, не нашел использования, насколько позволяет автоматизированный поиск..
Название: OFF C++: Очень сильно странный код :)
Отправлено: vlad7308 от 21.04.2011 12:12:09
стандарту С++ не соответствует
компилится MSVC
ну и черт с ним :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 22.04.2011 13:40:34
Выснилось следующее:

ЦитироватьThe invocation of a destructor is subject to the usual rules for member functions (9.3), that is, if the
object is not of the destructor's class type and not of a class derived from the destructor's class type,
the program has undefined behavior (except that invoking delete on a null pointer has no effect).

То есть, достаточно свободно подходят к этому п. стандарта. Это по стандарту (!), оказывается, такое не ясно, можно или нельзя, в общем, не совсем нельзя :) Интел тоже компилирует, но выдаёт предупреждение.
Название: OFF C++: Очень сильно странный код :)
Отправлено: Сторонний от 22.04.2011 14:07:09
А с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
Название: OFF C++: Очень сильно странный код :)
Отправлено: vlad7308 от 22.04.2011 16:50:01
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
Название: OFF C++: Очень сильно странный код :)
Отправлено: Сторонний от 22.04.2011 21:27:40
Цитировать
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:
Название: OFF C++: Очень сильно странный код :)
Отправлено: Parf от 23.04.2011 10:50:55
Цитировать
Цитировать
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:

Тогда это не будет называться компиляцией. Это будет генерация рандомного машинного кода. :D
Название: OFF C++: Очень сильно странный код :)
Отправлено: LRV_75 от 23.04.2011 12:10:13
Коль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?
Название: OFF C++: Очень сильно странный код :)
Отправлено: ZOOR от 23.04.2011 23:02:13
2 LRV75 - А что это такое?

А вот тоже кажись в тему

(http://s40.radikal.ru/i089/1104/53/9381e7548548.jpg)

(http://s011.radikal.ru/i318/1104/45/7e9900795180.jpg)
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 24.04.2011 00:47:02
Цитировать
Цитировать
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:
Собственно, значительная часть истории развития языков программирования как раз и посвящена тому, чтобы дать возможность компилятору на основании анализа текста гарантированно выявить максимум ошибок. А тут в системе 2010 года полную чушь пишешь, успешно компилируется, и выясняется, что, в общем-то, по стандарту и так можно... и по-другому можно и вообще по-любому в этой ситуации можно.. Бред, ИМХО.
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 24.04.2011 00:51:37
ЦитироватьКоль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?
Работал 4 месяца в фирме, где при мне уволился последний человек, который у них это использовал :). Говорил, что главный признак квалификации по этой теме - знание тьмы особенностей поведения и багообразных фич этой библиотеки. По интонации, сложилось мнение о том, что не очень-то удачная штука. Но сам не пробовал - через 4 месяца вернулся из той фирмы на прежнюю, где это не нужно и хорошо, что так :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: Антип Од от 26.04.2011 04:49:45
ЦитироватьКоль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?

Это ужос глючный и кривой. Рекомендуется только тем, кто пишет софт для отмороженных любителей полупрозрачных разноцветных анимированных кнопочек. В этом случае затраты на борьбу с WPF будут сопоставимы с затратами на реализацию того же самого своими силами.

Всем, кто пишет софт для чего-то практически полезного WPF категорически противопоказан.

По теме если... Вот интересно, если этот код запустить... Че, правда чужой деструктор вызывается?
Название: OFF C++: Очень сильно странный код :)
Отправлено: vlad7308 от 26.04.2011 10:56:13
ЦитироватьПо теме если... Вот интересно, если этот код запустить... Че, правда чужой деструктор вызывается?
почему чужой?
вызывается как раз правильный - this то в деструктор передается неявно, и передается именно тот, который надо, то есть того объекта, через который вызывается деструктор

разговор про то, что вроде как синтаксис вызова деструктора такой в принципе не соответствует стандарту
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 26.04.2011 15:18:23
Я сейчас бы (после обсуждения и на специализированном форуме) сказал так - приведённый текст не соответствует здравому смыслу. Ибо да, навевает на мысль о вызове чужого деструктора. Но он, оказывается, не противоречит, в общем-то, записи в стандарте :). Такое чувство, что при принятии стандарта был какой-то очень важный компилятор :), где была такая бажка, и, чтобы него не обижать :), решили записать, что, мол, допускается при такой записи неопределённое поведение программы :)
Название: OFF C++: Очень сильно странный код :)
Отправлено: boez от 27.04.2011 16:39:18
Стоп, о каком вообще вызове деструктора идет речь??? Имя деструктора есть имя класса, с добавленной спереди тильдой! А в программе вызывается неизвестно что! Таких членов - Obj1 и Obj2 - вообще нет в классе! Это просто имена локальных переменных, они вообще с именами членов никак пересекаться не должны... В стандарте же говорится совсем о другом:

class CClass1 {
...
}

class CClass2 {
...
}

...

CClass1 var1;

var1.~CClass2();
Название: OFF C++: Очень сильно странный код :)
Отправлено: Сторонний от 27.04.2011 17:44:38
ЦитироватьСобственно, значительная часть истории развития языков программирования как раз и посвящена тому, чтобы дать возможность компилятору на основании анализа текста гарантированно выявить максимум ошибок. А тут в системе 2010 года полную чушь пишешь, успешно компилируется, и выясняется, что, в общем-то, по стандарту и так можно... и по-другому можно и вообще по-любому в этой ситуации можно.. Бред, ИМХО.
Совершенно верно, задача в том, чтобы НЕ компилировать неправильную программу, а не в том, чтобы получить какой-то результат на основе неправильного текста. :smile:

 Я уже не помню в каком именно древнем компиляторе, наверно в PL-1, можно было задавать "уровень ошибки", которая допускается при компиляции.
Название: OFF C++: Очень сильно странный код :)
Отправлено: Parf от 27.04.2011 17:07:44
ЦитироватьЯ уже не помню в каком именно древнем компиляторе, наверно в PL-1, можно было задавать "уровень ошибки", которая допускается при компиляции.

Да и в современных компиляторах это можно делать. Но самого слабого уровня, обычно, бывает достаточно. Более сильные уровни - трактовка предупреждений как ошибок, то есть исключение сомнительных мест в коде.
Название: OFF C++: Очень сильно странный код :)
Отправлено: Feol от 28.04.2011 15:04:23
Я всегда в MSVC предпочитаю на 4 уровне предупреждений работать. Много, чего видит. Но не включаю трактовать их, как ошибки. И исключаю явно предупреждение 4996 в настройках :)