- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
struct X {
int x;
int y;
X(int y_) :
y(y_),
x(y + 10)
{
}
};
int main()
{
X foo = X(16);
std::cout << "foo == (" << foo.x << ", " << foo.y << ")" << std::endl;
}
☆*:.。.o(≧▽≦)o.。.:*☆
gcc и clang выдают ворнинг, MSVC — молчит.
неужели сложно запомнить?:)
на самом деле /Wall наверное тоже сработает
https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/c5038?view=msvc-160
Говнокод справочный
> на самом деле /Wall наверное тоже сработает
Wall включает ещё какую-то хуйню, которая срабатывает даже на их стандартную библиотеку. Поэтому оно не особо полезно.
Плюс есть дефайн:
#define _STL_WARNING_LEVEL 3
Который также отключает варнинги в STL (но вроде ниже 3 уровня нельзя ставить - там еррор кидается)
Но я юзаю предкомпилированные заголовки, поэтому все инклуды на STL и зависимости у меня в одном месте (а не как у людей по всему коду размазаны всякие string или cstdlib.
Типа как:
#pragma GCC diagnostic ignored "-Wuninitialized"
Можно врубить определённый варнинг на определённом участке кода, можно вырубить, можно вернуть на значение по умолчанию...
STL и boost я вряд-ли буду править, а свой код я может хочу вылзизать до блеска
> The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.
(перегрузка вызова компилятора)
Лучше уж тогда PS взять, но хуй знает скока он будет запускаться.
И я совсем не уверен, что в cproj можно так легко подменить компилятор на bat файл, и не объебаться при этом с аргументами, их экскейпингом итд, и что после этого любой msbuild мне это всё нормально соберет.
На юниксе нормально в Makefile напрограммить, а в студии на винде лучше быть аккуратным.
Действительно, лучше прикрутить статанализ типа пиваса (он он платный же)
А R# вроде гоняет clang-tidy под капотом (судя по номерам ошибок)
Тоже мне проблема. Можешь на Си или на крестах написать эту логику, и скомпилировать в exe файл. Там нихуя сложного нет, надо тупо вызвать cl.exe с теми же параметрами, но еще добавлять или не добавлять /Wall в зависимости от пути к компилируемому файлу.
можно обосраться с передачей аргументов
https://docs.microsoft.com/en-gb/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way
Это ты серьезно? Там правда могут быть проблемы с тем, чтоб вместо вызова компилятора cl.exe эта IDE вызывала хуйню, которую я руками где-то прописал? Как вы таким говном вообще пользуетесь?
Скорее, интуитивно. Может быть оно и заведется, но зуб бы я не дал (см выше консёрн с аргументами)
Недавно стало можно сувнуть любой компилятор
https://devblogs.microsoft.com/cppblog/use-any-c-compiler-with-visual-studio/
но я не удивлюсь, если там в коде IDE перечислены все 4 компилятора, а при попытке сунуть туда что-то не то можно словить какое-то говно
>Как вы таким говном вообще пользуетесь?
Когда пользуешься MS, лучше пользоваться официально документированными плюшками.
Пытаться что-то под себя кастомизировать может оказаться себе дороже. ИМХО
> Недавно
Пиздец.
> Когда пользуешься MS, лучше пользоваться официально документированными плюшками.
Поэтому я против MS и их говностудии.
XCode, знаете, тоже на винде не работает, и вижалси не умеет (и я даже не уверен, что он может gcc, бо официально у ябла шланг уже 7 лет как)
Хотя я согласен, что средства разработки от MS могли бы быть погибче: программист всё таки не обезьянка
Ну, чтобы не париться с особенностями msvc, к примеру.
Сём, тебе кто пароль от этой учётки дал?
https://www.youtube.com/watch?v=8QCcmqaEMPI
Иногда бывают такие библиотеки, которые говнокомпилятор вижуалстудии тупо не собирает или собирает, но получается какая-то багнутая хуйня, и происходит это из-за того, что мелкомягкие не соблюли стандарт, а не из-за каких-то там гнутых экстеншенов или асмовставок в коде той библиотеки. Самый банальный пример - open() в винде для бинарных файлов требует особую хуйню O_BINARY и O_TEXT для текста, в стандарте POSIX https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html такой хуйни не описано (а в стандарте Си функции open() нет вообще, мелкомягкие могли бы просто не реализовывать ее, если она им так не нравится, но они реализовали, насрав какой-то своей хуйни),и если тупо заюзать либу, которая прямолинейно через open открывает файл и читает некие байтики без всяких там костылей-специально-для-винды, оно обосрется.
Дык она не open(), а _open() насколько я помню. Так что могут делать что хотят.
Ну оно изначально было у них open() и на это имя оно все еще откликается
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open?view=msvc-160
> The Microsoft-implemented POSIX function name open is a deprecated alias for the _open function. By default, it generates Compiler warning (level 3) C4996. The name is deprecated because it doesn't follow the Standard C rules for implementation-specific names. However, the function is still supported.
Т.е. "Да, мы насрали на стандарт в свое время, и теперь мы сделали _open(), но open() все еще поддерживается, мы продолжаем срать на стандарт для обратной совместимости со старым говнокодом"
Разгадка простая: Виндуос НЕ позикс совместимая ОС.
Если ты используешь что-то позиксовое, то на винде будет говно.
Или пиши fopen, который кросс-платфомернный, или на пинде юзай CreateFile
Во всяком случае именно благодаря ему на макбуке и на сервере с линуксом баш и руби работают примерно одинаково)
Стандарт включает в себя текст стандартов POSIX (IEEE 1003.1) и X/Open Curses, опираясь на стандарт C99 (ISO/IEC 9899:1999).
Кстати, макось и солярка -- UNIX
Дистры линукса (мейнстримные во всяк случае) и BSD -- нет
Оче дорого
AMOGUS ;__;
Жалко, что многие дистры линукса не «Unix». Надеюсь, отойдя от стандартов, там что-нибудь умное придумали.
Зато там «posix», поэтому программы переносимы на уровне исходного кода, это хорошо :-)
Может какой нить RH с LTS 15 лет может позволить себе это для минобороны США, но у арчей и дебианов денег нет
Скорее всего, Linux и так почти полностью соответствует SUS, иначе бы много чего не работало
> BSD
это которые юзали формат PDP-7 в XXI веке?
в сперме был interix но потом его просралли
> Если ты используешь что-то позиксовое, то на винде будет говно.
Зачем? Вот зачем разрабы винды сделали конкретно вызов open() говном? На-ху-я добавлять эту дрисню с O_BINARY и O_TEXT? Есть вызовы fopen и там есть "wb" "rb", вот через него и читайте текстовую парашу с учетом этой вот "/r/n" хуйни.
Я могу и про другие обсеры сказать, например там wchar_t 16-битный
https://ru.wikipedia.org/wiki/Широкий_символ
> В Windows API тип wchar_t именуется как WCHAR и имеет фиксированный размер 16 бит, что не позволяет кодировать весь набор символов Unicode (больше 1 миллиона). Поэтому нарушается стандарт ANSI/ISO C, который требует, чтобы символьный тип wchar_t поддерживал все представимые в системе символы в одном объекте wchar_t. По сути, в WinAPI под WCHAR подразумевается 2-байтное слово из кодировки UTF-16LE (как тип WORD), поэтому символы с кодами выше FFFF16 кодируются парой WCHAR (так называемые «суррогаты») и всем API-функциям передаётся не количество символов, а размер символьного массива в машинных словах.
Это имеет какое-то отношение к позиксу или не-позиксу?
Хуёво быть первопроходцем, да. Тогда все думали, что 16 бит хватит для всех...
Поэтому, когда стандартизаторы юникода досыпали ещё говносимволов, майкрософт оказался между джвух стульев и вынужден был перейти на UTF-16.
З.Ы. Емнип, была где-то статья что майки сами жалеют о том, что завязались на 16 бит и не подумали, что юникод может так разрастись.
Как-то они очень хуево думали. Сколько там всяких символов в японском-китайском наберется? Уж наверняка больше 65536. А есть еще дохуя всяких других языков.
> Сложно определить точное количество иероглифов в китайском языке. Приведем некоторую статистику:
> Стандарт грамотности в Китае — это 1500 иероглифов для сельской местности или 2000 иероглифов для городов и для служащих в селе.
> 3000 иероглифов достаточно для чтения газет и неспециализированных журналов.
> Словарь иероглифов «Чжунхуа цзыхай» (1994г) издания содержит 85 568 иероглифов
> Пятое издание «Словаря китайских иероглифов и их вариантов» содержит 106 230 иероглиф
Как всё сложно. Именно поэтому я за ASCII
Тлен и безысходность.
На винде вообще работа с кодировкой ебанутая.
CRT всегда высирает в той кодировке, которая стоит у консоли.
Там как-бы есть юникод, но сломанный.
Думаешь кому-то хочется искать, что там надо поправить в этом ебучем xml? Да ещё и с ебучим виндовым ограничением на длину командной строки из-за которого списки файлов идут через файл...
Но вообще, существующие анализаторы умеют туда встраиваться. Так что какая-то механика есть.
на самом деле дерьмовая конвенция для узкого круга зада ч
А если перед инклудом такой библиотеки отключить /Wall какой-то прагмой, а после инклуда обратно включить, это сработает? Ну типа, чтоб для питушни, нагенереннгой такой-то компилтайм-либой, никакие варнинги не работали
https://docs.microsoft.com/en-us/cpp/preprocessor/warning?view=msvc-160
Но это — жёсткое прибивание кода к VS. Можня, конечно, расставить везде #ifdef _MSC_VER, но это какая-то хер-ня получается.
Ну это можно скостылить же
Делаем файл incl_without_warn.h со следующим содержимым
И можно делать:
И тогда все норм будет.
Да проще тогда в stdafx.h всё "системное" хуйнуть, чем так пердолиться над каждым инклудом...
Это все потому, что сишный макрос не может раскрыться в другой макрос и/или в инклуд. Надо препроцессор патчить.
https://i.imgur.com/hO8x9NQ.png
И это только после компиляции! Нямножко подождала, IntelliSense ещё добавил: https://i.imgur.com/hlTryEG.png .
У меня на такое решарпер ругается, и просит их местами поменять
И на глаз тоже почти не отличается.
http://govnokod.ru/23604
Проверкой в CI.
Не, кастомное правило на любой не-ascii в исходнике помимо комментов. Ибо нехуй.
А из других структур нельзя.
Например если прочитать говно из bool, то можно разрушить случайно true == true
?
А после этого уже что угодно может быть
Поэтому выебать программиста он может только в рантайме.
Ему передадут.
байт вроде можно читать неинициализированным, просто мусор будет
Джавашок что ли?
в винде есть
typedef unsigned char BYTE;
А в крестах нету байта же((
https://en.cppreference.com/w/cpp/types/byte
>>17
ну понятно
а его тоже можно читать неинициализированно?
typedef уже не в моде?
https://upload.wikimedia.org/wikipedia/commons/5/51/Soundviewbxrow.JPG
Медленно доходит до середины сцены, снимает штаны, садится на стул и принимается ожесточенно (додумайте сами в общем)...
В зале стоит полная тишина. Вдруг раздается голос:
- Мужчина, да как вам не стыдно!
Мужик на сцене испуганно задувая свечку:
- Кто здесь?!
Потому что наследовать можно несколько интерфейсов, а несколько абстрактных классов нельзя.
Так в джаве, и я на 87% уверен, что так же и в C#
Что мешает просто разрешить в интерфейсах статические методы и конструкторы?
В чём ещё профит в абстрактном классе, кроме как в обходе этих странных ограничений?
ничего не мешает, они там есть
>и конструкторы
Придется решать вопрос виртуального/невиртуального наследования
сколько раз вызовется конструктор Animal?
>В чём ещё профит в абстрактном классе
В абстрактном классе можно хранить какие-то поля, а в интерфейсе нет.
Pure abstract класс без полей ничем не отличается от интерфейса, и наверное не нужен
Интерфейс в C# это, по сути, протокол
- Orly?
https://jeremybytes.blogspot.com/2019/12/c-8-interfaces-static-members.html
в джаве есть изначально
А зачем тебе статичесчкий метод в интерфейсе? Он же там просто как в неймспейсе лежит
var t = T(foo);
?
Увы, в C# и java нужно через фабрику (это не кресты)
Не то, что в «С++» или, например, в «Nim». Смотри, какой няшный дженерик:
Там совершенно нормально передать куда-то класс, и вызвать у него любой метод, включая конструктор
Другой вопрос, что переходить с шарпа на питон вряд-ли стоит)
- в Шарпе-то?
Ну и в Свифте ж как-то решили
Интерфейс это протокол, это просто обещание "я клянусь иметь такие-то методы"
В нем нету кода
Как только в нем появляется код или поля, то сразу начинается масса вопросов
А в свифте есть множественное наследование?
> в свифте есть множественное наследование?
- нет
Обычный метод диспатчится статически, и зависит от типа указателя.
Виртуальный диспатчится в рантайме, и зависит от реального объекта.
(а вот в джавке все методы виртуальные)_
Но я не про виртуальные методы, я про виртуальное наследование
https://en.wikipedia.org/wiki/Virtual_inheritance
Представим, что в у интерфейсов в шарпе есть конструкторы.
Ответь на вопрос: сколько раз для примера выше вызовется конструктор Animal?
Класс тут только Svinosobaka
И вот я его инстанциировал
А может кто-то захотеть, что бы он вызвался два раза, и создались два Animal (см ссылку про виртуальное и невиртуальное наследование в C++)
Это одна из проблем, которая возникла бы, если бы интерфейсы имели конструкторы.
В С++ вместо интерфейсов используются абстрактные классы, которые могут иметь поля, и там возникает еще куча вопросов, например если у Animal есть поле foo, то у Svinosobaka теперь есть два таких поля, и когда ты передаешь свинособаку во что-то, что ождиает Animal, то ты должен явно его скастить в Dog или Pig, иначе компилятор не поймет, какое поле использовать
Так или иначе, конструкторов в interface нет.
И даже требовать наличие конструктора они не могут (вроде бы в яблоке можно требовать в протоколе наличие метода init)
так же вроде
- я так до конца не понял, какие вопросы, ведь интерфейс это просто контракт и, как ты сам и заметил, никакого кода не содержит
А вот почему в интерфейсе нельзя определить конструткор без кода (то есть потребовать от реализующего его класса такой конструктор) я не знаю
Потому что с травкой пора завязывать...
Какую практическую задачу ты пытаешься решить, наложив такое ограничение на конструкторы реализаций?
а что тут не так?
PHP поступает точно также
https://govnokod.ru/27424#comment627351
Веб-программирования, тут я тоже скажу, это не особо интересно, лично мне это совсем не интересно, хотя иногда приходится разбираться HTML.
А вот программирования игр это интересно, можно начать с программирования несложных игр с помощью всяких конструкторов. Ну или программирования модов, я например увлекаюсь С.Т.А.Л.К.Е.Р.ом, в результате освоил более или менее ассемблер, потом по хуже С++, ну и конечно Lua.
В общем, у каждого свой путь!
https://habr.com/ru/company/habr/blog/435562/#comment_19638102
Тот же крендель
По мне Си плох тем, что слишком высокоуровневый.
Не хватает ЯП занимающий промежуточное место между С/С++ и ассемблером.
https://habr.com/ru/company/vdsina/blog/532416/#comment_22428200
И еще немного
Хорошо когда IDE может подсвечивать одинаковые слова, при выделении одного из них, как это делается в Notepad++, не все IDE это могут делать, из-за этого приходится открывать один и тот же файл и VS2010 и Notepad++
https://habr.com/ru/company/pvs-studio/blog/488332/#comment_21279542
ну и лучшее
Можно на С++ писать так, как на ассемблере, т.е. по возможности без лишней абстракции, ну примитивные данные быстрей обрабатываются.
https://habr.com/en/post/484688/#comment_21191180
Ему ещё и плюсы лепят! )))
Вообще он прекрасен. Например вот:
А во обще странно, почему тормозит. Я недавно тестировал компиляторы VS C++ 2010 и VS C++ 2017, да к новый компилятор генерирует более оптимальный код, 5-10% можно получить быстродействия, и это простой перекомпиляцией. Ну а если вдруг проект стал тормозить значит, значит к проекту прилипла что-то тормозящие, в смысле библиотека.
---
или вот
А то я в последнее время приобрёл привычку сжимать исходник, чтобы колёсико мышки меньше изнашивалось.
Раньше делал так:
а теперь делаю так
-----
Без матана конечно можно, но например программисту лучше всё же его знать. Программирование это прежде всего логика, математика уже вторична
----
Кстати, в «Nim» исходники получаются меньше чем в Сисюке, т.к. там нет фигурных скобок, поэтому колёсико мыши меньше изнашивается. Ещё одна причина перейти на «Nim».
Потому я страдаю в питухоне
Кстати, в руби между бегинами и ендами скачет норм
Положим, ты хочешь выделить тело функции.
Ты ставишь каретку на {, жмешь V%, и выделяешь всё до конца функции
Кстати, для питона есть такое:
https://vi.stackexchange.com/questions/7262/end-of-python-block-motion
Тебе не подойдёт?
Тебе никогда не нужно было посмотреть где функция кончается, например?
А ещё есть такая штучка в емаксе, она показывает какие в файле есть функции, классы и т.п., можно там тыкать и прыгать к дефиниции. Правда, я не знаю, как это включить в питоне и «Nim» (((
ты же не только с кодом который сам написал работаешь
говна на тыщи строк встречаются в любом проекте старше 5 лет думаю
Это просто значит что функция не прошла естественный отбор
I'm Going Back to Reddit
Чем бы мне ни заниматься, лишь бы только с емаксом не ебаться?