powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / На чём лучше писать код при одинаковом количестве строк: на C или на C++?
25 сообщений из 474, страница 2 из 19
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490799
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbя и не говорил, что не удобно. Весь COM на интерфейсах сделан, очень удобно.
Но в большинстве случаев полиморфизм можно не использовать. Даже так: лучше не использовать, если можно не использовать. Всё, что может быть сразу посчитано, должно быть сразу посчитано.COM, кстати, никакого отношения к ООП, по большому счету, не имеет. В COM, это соглашение и при написании COM объектов без труда и лишний костылей можно использовать процедурное программирование. Для интересующихся есть прекрасная книга по основам COM ( Inside COM ) Дейла Роджерсона, которую, также, можно найти в хорошем русском переводе на просторах рунета.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490803
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devв Си и C++ даже синтаксис условных директив компилятора несколько отличается
А можно как-то увидеть чем именно несколько отличается? Чисто для поднятия уровня эрудиции.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490806
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яrdb_devв Си и C++ даже синтаксис условных директив компилятора несколько отличается
А можно как-то увидеть чем именно несколько отличается? Чисто для поднятия уровня эрудиции.

:) ну, в ANSI C89 таки нет #if defined
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490809
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яА можно как-то увидеть чем именно несколько отличается? Чисто для поднятия уровня эрудиции. Всё здесь .
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490812
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devschiНикто не мешает писать на C, используя принципы ООПЭто как? Ну, с инкапсуляцией понятно, а как быть с полиморфизмом, наследованием и виртуальными методами? Писать всё ручками в соответствии с ABI C++? Это шутка такая?

начем с того, что полиморфизм, наследование и виртуальные методы - они в большинстве случаев реально мало нужны, если починить проблему ООП головного мозга и правильно проектировать архитектуру решения.

где они еще с натяжкой применимы как must have - это вские виджеты или UI контролы, но и там - все достижимо - см. реализацию GTK+
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490816
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchгде они еще с натяжкой применимы как must have - это вские виджеты или UI контролы, но и там - все достижимо - см. реализацию GTK+GTK+, это процедурное API.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490819
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereПредполагается, что строк одинаково или почти одинаково, понятность тоже не отличается.
Преимущества на C: думаю, скорость и большая универсальность (C понимают и некоторые другие языки).
Преимущества на C++: больше всяких новинок (начиная с C++11), больше манёвров для изменений.

Кто что думает?

я в бытность купился на то, чтобы писать исключительно на C, а не на C++, ибо так завещал великий Торвальдс, да и изучать гигазы "рулеза" вроде STL/Boost откровенно не хотелось.

в принципе о принятом решении я нисколько не жалею, но нужно понимать, что ты будешь вынужден писать свой собственный
велосипед как раз на тему того, что уже делает (хоть и плохо) STL и Boost

а это плохо, ибо велосипед - его будет знать и развивать ну очень ограниченное сообщество.

меня пока сдерживает только перспектива "новой парадигмы" - в собственном "STL" я в принципе ушел от понятия heap (malloc/free прикладному программисту у меня недоступны, все ловко сделано аля Java GC с поколениями и стек-контекстами), и еще пару идей

но начинающим подобное строго противопоказано.

P.S. А вот что действительно недостает в C - так это параметров по умолчанию, перегруженных функций и возможности явно скрывать поля в структурах, оставляя RTTI о размере объекта в целом.
решается это все конечно макросами и прочими _Generic, но какой ценой....

в общем без реально веских на то причин и без 10+ лет опыта подсаживаться на Pure C - не стоит
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490822
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchну япропущено...

А можно как-то увидеть чем именно несколько отличается? Чисто для поднятия уровня эрудиции.

:) ну, в ANSI C89 таки нет #if defined
Пруф, видимо, при передаче в интернет утратился?
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490824
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яПруф, видимо, при передаче в интернет утратился?Какой тебе еще пруф? напиши в заголовочном файле какой-нибудь программы на Си #if defined() и попробуй компильнут на "Гнусе". Вот и весь пруф!
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490829
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devdbpatchгде они еще с натяжкой применимы как must have - это вские виджеты или UI контролы, но и там - все достижимо - см. реализацию GTK+GTK+, это процедурное API.

и что с того? внутри лежит именно компонентная ООП модель.

восприятие ООП на С начни с простого факта, что функционально нет никакой разницы между

Код: plaintext
1.
object->method(params) и 



Код: plaintext
1.
CLASS_method(object, params)



все остальное это лишь визуально-синтаксический сахарок. при должном навыке на C можно писать точно такой-же, в т.ч. и по компактности в строках код. выглядеть будет непривычно, но это будет точно такой-же по возможностям ООП язык
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490835
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devну яПруф, видимо, при передаче в интернет утратился?Какой тебе еще пруф? напиши в заголовочном файле какой-нибудь программы на Си #if defined() и попробуй компильнут на "Гнусе". Вот и весь пруф!

Я потом проверю.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490839
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devну яПруф, видимо, при передаче в интернет утратился?Какой тебе еще пруф? напиши в заголовочном файле какой-нибудь программы на Си #if defined() и попробуй компильнут на "Гнусе". Вот и весь пруф!
Ну зачем же "еще", мне б хоть какой-то увидеть, а то все никак ничего добиться не получается.
Вот открыл навскидку что болтается под рукой из гнусного - sha1.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
#if defined(__i386__) || defined(__x86_64__)
  #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val))
#elif defined(__GNUC__) && defined(__arm__)
  #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0)
#else
  #define setW(x, val) (W(x) = (val))
#endif
...


И где тут не работают #if defined() ?

Так где пруфчик-то насчет "синтаксис условных директив компилятора" С и С++?
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490845
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devну яПруф, видимо, при передаче в интернет утратился?Какой тебе еще пруф? напиши в заголовочном файле какой-нибудь программы на Си #if defined() и попробуй компильнут на "Гнусе". Вот и весь пруф!

ну, справделивости ради - GNU C вполне себе поддерживает #if defined даже в режиме -ansi -pedantic

честно говоря уже не помню, на именно каком C компиляторе я на это наступил
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490846
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchну япропущено...

А можно как-то увидеть чем именно несколько отличается? Чисто для поднятия уровня эрудиции.

:) ну, в ANSI C89 таки нет #if defined

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
6.10.1  Conditional inclusion
Constraints
1
The expression that controls conditional inclusion shall be an integer constant expression
except that: identifiers (including those lexically identical to keywords) are interpreted as
described below;
166)
and it may contain unary operator expressions of the form
defined
identifier
or
defined (
identifier
)
which evaluate to 1 if the identifier is currently defined as a macro name (that is, if it is
166) Because  the  controlling  constant  expression  is  evaluated  during  translation  phase  4,  all  identifiers
either are or are not macro names — there simply are no keywords, enumeration constants, etc.
162                                                          Language
§6.10.1
N1570 
Committee Draft — April 12, 2011
ISO/IEC 9899:201x
predefined or if it has been the subject of a
#define
preprocessing directive without an
intervening
#undef
directive with the same subject identifier), 0 if it is not
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490848
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchи что с того?Ничего. Просто уточнил.
dbpatchвнутри лежит именно компонентная ООП модель.Как это реализовано, для "внешнего наблюдателя" не имеет значения.

dbpatchвосприятие ООП на С начни с простого факта, что функционально нет никакой разницы между

Код: plaintext
1.
object->method(params) и 



Код: plaintext
1.
CLASS_method(object, params)



все остальное это лишь визуально-синтаксический сахарок. при должном навыке на C можно писать точно такой-же, в т.ч. и по компактности в строках код. выглядеть будет непривычно, но это будет точно такой-же по возможностям ООП языкЯ в курсе, что вызов метода объекта, это вызов обычной функции с передачей в параметре this указателя на экземпляр класса, который, в большинстве случаев, содержит в качестве первого члена указатель на таблицу виртуальных методов. Собственно, указатель на экземпляр класса можно интерпретировать как указатель на указатель к массиву указателей на функции, каждая из которых в качестве первого параметра принимает указатель на экземпляр класса. Нам-то с тобой понятно, что я написал, а новичок будет долго фтыкать и курить ABI.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490851
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devdbpatchи что с того?Ничего. Просто уточнил.
dbpatchвнутри лежит именно компонентная ООП модель.Как это реализовано, для "внешнего наблюдателя" не имеет значения.

dbpatchвосприятие ООП на С начни с простого факта, что функционально нет никакой разницы между

Код: plaintext
1.
object->method(params) и 



Код: plaintext
1.
CLASS_method(object, params)



все остальное это лишь визуально-синтаксический сахарок. при должном навыке на C можно писать точно такой-же, в т.ч. и по компактности в строках код. выглядеть будет непривычно, но это будет точно такой-же по возможностям ООП языкЯ в курсе, что вызов метода объекта, это вызов обычной функции с передачей в параметре this указателя на экземпляр класса, который, в большинстве случаев, содержит в качестве первого члена указатель на таблицу виртуальных методов. Собственно, указатель на экземпляр класса можно интерпретировать как указатель на указатель к массиву указателей на функции, каждая из которых в качестве первого параметра принимает указатель на экземпляр класса. Нам-то с тобой понятно, что я написал, а новичок будет долго фтыкать и курить ABI .

не будет, ибо он понятия не имеет, что это такое и зачем это ему нужно.

новичок обычно начинает с зачитывания какого Страустрап за 21 день и дальше начинает просто подражать другим.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490853
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot dbpatch]rdb_devвосприятие ООП на С начни с простого факта, что функционально нет никакой разницы между

Код: plaintext
1.
object->method(params) и 



Код: plaintext
1.
CLASS_method(object, params)



все остальное это лишь визуально-синтаксический сахарок. при должном навыке на C можно писать точно такой-же, в т.ч. и по компактности в строках код. выглядеть будет непривычно, но это будет точно такой-же по возможностям ООП язык
А нельзя ли раскрыть по "все остальное" к примеру про эксепшены и деструкторы, про выход из области видимости и деструкторы. Как это написать на С при должном навыке, покажите?
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490870
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbможете кинуть в меня камушком, но виртуальные методы - это не капец какая нужная штука, без них можно в большинстве случаев обойтись. Вот инкапсуляция - это бОльшая часть ООПы. А полиморфизм - это когда:
- у вас есть набор объектов разных классов
- все свалены в одну кучу
- и вы понятия не имеете, кто из ни кто, на тот момент когда с ними вдруг понадобилось что-то сделать.

... да это бардак какой-то! Угу, бардак. Только иногда неизбежный. Например, ваш экзешник прилинковывает к себе чужие плагины... причём с двунаправленным импортом таблиц функций... причём на операционке, которая не поддерживает двунаправленный импорт (т.е. после работы системного линковщика функции DLL могут быть вызваны из экзешника, но не наоборот). И внезапно двум плагинам хочется использовать функции _друг_друга_, да ещё подгрузить свои карманные DLL-ки.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490871
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яА нельзя ли раскрыть по "все остальное" к примеру про эксепшены и деструкторы, про выход из области видимости и деструкторы. Как это написать на С при должном навыке, покажите?

1) exceptions как концепция - это очень большая ошибка индустрии, ибо это лишь завуалированная форма GOTO, причем за область видимости функции. породила намного, намного больше проблем, чем решила.

я вот за многие уже десятки лет так и не понял, на кой хрен они вообще были придуманы. как способ возврата кодов ошибки - возможно, хоть и криво, а так, в большинстве случаев они лишь используются для неперехватываемого проброса наверх для генерации call-stack trace и dump. ну так последнее в C можно делать и обычным способом - backtrace и вперед.

в общем на кой нужны эти ваши Exceptions - для меня лично есть большая загадка.

а за программировать "логику" на исключениях - и это все признают, нужно руки отбивать.

кроме того, есть прицип live-to-die, "падай как можно раньше", см. PHP, Erlang и подобное - там никакие "пробросы и обработка исключений" не нужны, любое необработанное исключение априори приводит к завершению процесса и уведомлению об том клиента

2) деструкторы нужны только для "эстестично глазоприятного" освобождения ресурсов, вроде файловых хендлов, или дерганий free()
аналогично про области видимости. в остальном это просто вызовы функций - бери и вызывай их явно, в чем проблема?


лично меня подобная проблема (освобождение ресурсов) вообще не парит - я давно пришел к пониманию "контекста" - к примеру времени жизни веб запроса.
прикладному программисту вообще не нужно париться про все эти освобождения, у него программа живет пару миллисекунд всего.
все вызовы на открытие файлов и аллокации памяти можно "оборачивать" и "коллекционировать", а после завершения запроса / контекста
(отдачи результата клиенту) централизованно и неявно, через собственный менеджер ресурса - освобождать,
тем самым проблема утечек памяти и невнимательности прикладного кодера уходит как класс, и деструкторы в принципе не нужны
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490878
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_an_ruCEMbможете кинуть в меня камушком, но виртуальные методы - это не капец какая нужная штука, без них можно в большинстве случаев обойтись. Вот инкапсуляция - это бОльшая часть ООПы. А полиморфизм - это когда:
- у вас есть набор объектов разных классов
- все свалены в одну кучу
- и вы понятия не имеете, кто из ни кто, на тот момент когда с ними вдруг понадобилось что-то сделать.

... да это бардак какой-то! Угу, бардак. Только иногда неизбежный. Например, ваш экзешник прилинковывает к себе чужие плагины... причём с двунаправленным импортом таблиц функций... причём на операционке, которая не поддерживает двунаправленный импорт (т.е. после работы системного линковщика функции DLL могут быть вызваны из экзешника, но не наоборот). И внезапно двум плагинам хочется использовать функции _друг_друга_, да ещё подгрузить свои карманные DLL-ки.

пример неудачный.

ясен пончик, что если ты решился взять в зависимости чужие благоглупости - то ты будешь вынужден брать в арсенал и на обслуживание весь накопленный бардак, соглашения и прочие принципы и правила.

мы говорим больше про идеализированного коня в вакууме - пишем с нуля, выбрасываем все ненужное и лишнее
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490879
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яНу зачем же "еще", мне б хоть какой-то увидеть, а то все никак ничего добиться не получается.
Вот открыл навскидку что болтается под рукой из гнусного - sha1.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
#if defined(__i386__) || defined(__x86_64__)
  #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val))
#elif defined(__GNUC__) && defined(__arm__)
  #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0)
#else
  #define setW(x, val) (W(x) = (val))
#endif
...


И где тут не работают #if defined() ?

Так где пруфчик-то насчет "синтаксис условных директив компилятора" С и С++?Какой стандарт Си задал компилятору? С99?
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490880
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchлично меня подобная проблема (освобождение ресурсов) вообще не парит - я давно пришел к пониманию "контекста" - к примеру времени жизни веб запроса.Десяток взаимодействий с дефицитными "долгоживущими" разделяемыми ресурсами, использующими что-то вроде AddRef() и Release(), которые в силу дефицитности не могут ждать даже до конца вот этого коротенького "контекста" --- и вот тут-то вы и начнёте мечтать о плюсах :)
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490883
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_an_rudbpatchлично меня подобная проблема (освобождение ресурсов) вообще не парит - я давно пришел к пониманию "контекста" - к примеру времени жизни веб запроса.Десяток взаимодействий с дефицитными "долгоживущими" разделяемыми ресурсами, использующими что-то вроде AddRef() и Release(), которые в силу дефицитности не могут ждать даже до конца вот этого коротенького "контекста" --- и вот тут-то вы и начнёте мечтать о плюсах :)

пример сугубо гипотетический, и тем самым неактуальный.

из моей практики были примеры "долгоживущих" - в тех же самых контекстах стоит задача интеграции со сторонними вебсервисами и прочими базами данных,
условно 100500 клиентских коннекшинов одномоментно делают запросы, а количество соединений к внешней базе данных ограничено (не более 10 за раз, к примеру).

и?

да никакого и - опять на сцену выходит централизованный менеджер ресурсов, под названием POOLер, все 100500 клиентов сидят в очереди к условно 10 операционистам со своими билетиками электронной очереди, ничего нового, теорию массового обслуживания никто не отменял.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490884
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_an_ruУгу, бардак. Только иногда неизбежный. Например, ваш экзешник прилинковывает к себе чужие плагины... причём с двунаправленным импортом таблиц функций... причём на операционке, которая не поддерживает двунаправленный импорт (т.е. после работы системного линковщика функции DLL могут быть вызваны из экзешника, но не наоборот). И внезапно двум плагинам хочется использовать функции _друг_друга_, да ещё подгрузить свои карманные DLL-ки.Для этого, обычно, делают прокси библиотеку сопряжения, в которую "экзешник", при инициализации библиотеки, передаёт указатели на реализованные в нем функции, что могут быть вызваны другими библиотеками через прокси библиотеку. По такому принципу, к примеру, сервер FirebirdSQL позволяет UDF библиотекам выделять память в своей куче для возвращения ему некоторых параметров из функций UDF библиотек.
...
Рейтинг: 0 / 0
На чём лучше писать код при одинаковом количестве строк: на C или на C++?
    #39490885
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchiv_an_ruпропущено...
Угу, бардак. Только иногда неизбежный. Например, ваш экзешник прилинковывает к себе чужие плагины... причём с двунаправленным импортом таблиц функций... причём на операционке, которая не поддерживает двунаправленный импорт (т.е. после работы системного линковщика функции DLL могут быть вызваны из экзешника, но не наоборот). И внезапно двум плагинам хочется использовать функции _друг_друга_, да ещё подгрузить свои карманные DLL-ки.

пример неудачный.

ясен пончик, что если ты решился взять в зависимости чужие благоглупости - то ты будешь вынужден брать в арсенал и на обслуживание весь накопленный бардак, соглашения и прочие принципы и правила.

мы говорим больше про идеализированного коня в вакууме - пишем с нуля, выбрасываем все ненужное и лишнееНаша Виртуоза, как и любая другая толстая СУБД --- это тот самый конь и есть, не только написанный с нуля, но и настолько "в вакууме", что, в принципе, незначительными добавками программа может быть превращена в операционную систему (Достаточно вкорячить немного HAL и бутявку, а остальное и так всё своё, включая раздатчики памяти, сеть и кластерные IPC, планировщик файловой подсистемы и т.п.) И тем не менее, мы с нетерпением ждём подходящего момента для полноценной миграции с голых сей на плюсы.
...
Рейтинг: 0 / 0
25 сообщений из 474, страница 2 из 19
Форумы / Программирование [игнор отключен] [закрыт для гостей] / На чём лучше писать код при одинаковом количестве строк: на C или на C++?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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