Язык программирования c стандарт c 11
Стандарты языка С++
История стандартов языка C++
Важную роль в развитии языка C++ играют стандарты языка. Хотя язык C++ разрабатывался с 1980-х годов, первый стандарт языка C++98 был окончательно утвержден только в 1998 году.
В 2003 году был издан стандарт С++03, являющийся уточнением стандарта C++98.
Наиболее существенные изменения языка произошли в стандарте C++11, разработка которого завершилась в 2011 году. Далее будут изложен ряд нововведений стандарта C++11.
В 2014 году был издан стандарт С++14, не содержащий существенных изменений, а только устраняющий ряд дефектов стандарта С++11.
Разработка следующего стандарта C++17 будет завершена в 2017 году. Этот стандарт также содержит ряд интересных нововведений, однако их не столь много, как в стандарте С++11.
Ссылки:
Auto-тип переменной
При работе с контейнерами STL иногда приходится писать конструкции вида
map >::reverse_iterator it;
То есть описание типа может быть очень длинной строкой. Вместо этого в C++11 можно объявить имя типа, как auto , что означает, что компилятор должен сам определить тип переменной. В этом случае переменная должна быть явно инициализирована при объявлении, например:
auto it = a.begin();
В этом случае компилятор знает тип значения a , поэтому он может определить тип, который возвращает метод begin() , и тем самым будет определен тип переменной it .
Самый простой вариант (можно использовать для определения того, включена ли поддержка C++11):
В этом случае переменная a будет иметь тип int . Если написать:
то переменная a будет иметь тип double .
Обратите внимание, это НЕ динамическая типизация! Переменная по-прежнему имеет строго определенный тип, который не может быть впоследствии изменен! Но этот тип программист просто не указывает явно для облегчения труда.
range-based циклы
В C++11 появились range-based циклы: циклы, в которых переменная пробегает по всем значением контейнера. Контейнер должен поддерживать методы begin() и end() — это может быть vector , list , set , map .
Пример такого цикла для вывода элементов вектора:
Если цикл пробегает по элементам контейнера map, то переменная будет парой из двух элементов: ключ и значение. То есть:
map a;
for (auto & elem: a)
<
// a.first — ключ элемента словаря, a.second — его значение
>
Универсальная инициализация
В языке C элементы массива можно инициализировать списком значений, например, так:
В С++11 такая универсальная инициализация распространена на структуры и классы. В списке инициализации в фигурных скобках необходимо указать значения полей структуры в том порядке, в котором они объявлены. Например,
В этом случае P.x будет равно 1, P.y будет 2.
Еще один способ использования универсальной инициализации:
Поскольку pair является структурой, то этот способ можно использовать для инициализации pair . Например, если функция возвращает значение типа pair , то можно написать:
Шаблоны с переменным числом аргументов и std::tuple
В C++11 появилась возможность создания шаблонов с переменным числом аргументов. Один из примеров такого шаблона — tuple, определенный в одноименном заголовочном файле. Это кортеж, то есть переменная, которая содержит несколько полей различных типов.
Доступ к составным полям tuple осуществляется при помощи функции-шаблона get с одним числовым параметром — номер поля, к которому производится доступ. Например:
get (person) = «Peter»;
get (person) = «Ivanov»;
get (person) = 16;
Заметим, что инстанцирование шаблона происходит при компиляции, то есть порядковый номер поля должен быть константой, определенной на момент компиляции (нельзя сделать цикл по номеру поля, т.е. нельзя, например, написать
for (int i = 0; i a по последней цифре числа:
sort(a.begin(), a.end(), [](int x, int y) -> bool
Типы данных
С С++11 стандартизирован тип long long int , который раньше был расширением GNU C++.
Кроме того, появились типы данных фиксированного размера, например, «32-битное целое число», они определены в заголовочном файле cstdint.
Стандартная библиотека
Много изменений произошло в стандартной библиотеке. Например, появились хеш-таблицы unordered_set и unordered_map. Появились усовершенствованные генераторы случайных чисел и поддержка регулярных выражений.
§1 Общие сведения о языке. Этапы проектирования программы. Модели жизненного цикла приложений
Общие сведения о языке С++
C++ (читается си-плюс-плюс) — компилируемый, статически типизированный язык программирования общего назначения, на котором можно создавать программы любого уровня сложности.
Более 20 лет этот язык находится в тройке самых популярных и востребованных языков программирования. (В этом можно убедиться, посетив сайт TIOBE).
Язык возник в начале 1980-х годов, когда сотрудник фирмы Bell Labs Бьёрн Страуструп придумал ряд усовершенствований к языку C под собственные нужды.
Bjarne Stroustrup – создатель языка C++
Страуструп решил дополнить язык C возможностями, имеющимися в языке Симула. Язык C, будучи базовым языком системы UNIX, на которой работали компьютеры Bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами. В результате практические задачи моделирования оказались доступными для решения как с точки зрения времени разработки (благодаря использованию Симула-подобных классов), так и с точки зрения времени вычислений (благодаря быстродействию C).
Вот как об этом говорит сам разработчик языка:
В 1998 году был опубликован первый стандарт языка, известный как C++98, разработанный комитетом по стандартизации. C++ продолжает развиваться, чтобы отвечать современным требованиям. Одна из групп, разрабатывающих язык C++ и направляющих комитету по стандартизации C++ предложения по его улучшению — это Boost, которая занимается, в том числе, совершенствованием возможностей языка путём добавления в него особенностей метапрограммирования. Последний стандарт вышел в 2017 году и носит наименование С++17. Следующий стандарт не заставит себя долго ждать и появится, как ожидают, в 2020 году.
Никто не обладает правами на язык C++, он является свободным. В марте 2016 года в России была создана рабочая группа РГ21 С++. Группа была организована для сбора предложений к стандарту C++, отправки их в комитет и защиты на общих собраниях Международной организации по стандартизации.
С++ – это мультипарадигмальный язык (от слова парадигма – стиль написания компьютерных программ), включающий широкий спектр различных стилей и технологий программирования. Часто его причисляют к объектно-ориентированным языкам, но, строго говоря, это не так. В процессе работы разработчик получает абсолютную свободу в выборе инструментов для того, чтобы задача, решаемая с помощью того или иного подхода, была решена максимально эффективно. Иными словами, С++ не понуждает программиста придерживаться только одного стиля разработки программы (например, объектно-ориентированного).
C++ имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности. C++ повлиял на многие языки программирования, в их числе: Java, C#, D. Посукольку C++ принадлежит семейству языков основанных на синтаксисе языка Си, то можно легко освоить и другие языки программирования этого семейства: JavaScript, PHP, Perl, Objective-C и мн. др., в том числе, и сам родительский язык – Си. (Подробнее)
За время своего существования за языком С++ закрепились устойчивые мифы, которые легко опровергаются (см. здесь: Часть1 и Часть2)
История языка и выхода стандартов
Создатель языка – Бьёрн Страуструп, сотрудник Bell Labs, представил раннюю версию языка C++ (“Си с классами”)
Первый коммерческий выпуск C++, язык приобретает современное название
Выпуск первого издания The C++ Programming Language — книги, посвящённой C++, которую написал Бьёрн Страуструп
Ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»
Опубликован стандарт языка ISO/IEC 14882:2003, где были исправлены выявленные ошибки и недочёты предыдущей версии стандарта
Выпущен отчёт Library Technical Report 1 (TR1). Не являясь официально частью стандарта, отчёт описывал расширения стандартной библиотеки, которые должны быть включены в следующую версию языка C++
Выход нового стандарта – C++11 или ISO/IEC 14882:2011; новый стандарт включил дополнения в ядре языка и расширение стандартной библиотеки, в том числе большую часть TR1
Выход стандарта C++14 («International Standard ISO/IEC 14882:2014(E) Programming Language C++»); C++14 можно рассматривать как небольшое расширение над C++11, содержащее в основном исправления ошибок и небольшие улучшения
Выход нового стандарта – C++1z (C++17). Этот стандарт внес много изменений и дополнений. Например, в состав STD вошли библиотеки стандарта C11, файловой системы, основанная на boost::filesystem, большая часть экспериментальной библиотеки TS I.
C++20 — неофициальное название стандарта ISO/IEC языка программирования C++, который ожидается после после C++17. Черновик стандарта N4800.
Философия С++
В книге «Дизайн и эволюция C++» (2007) Бьёрн Страуструп описывает принципы, которых он придерживался при проектировании C++ (приводятся в сокращении):
- Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка C.
- Непосредственно и всесторонне поддерживать множество стилей программирования.
- Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.
- Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.
- Избежать разночтений между C и C++: любая конструкция, допустимая в обоих языках, должна в каждом из них обозначать одно и то же и приводить к одному и тому же поведению программы.
- Избегать особенностей, которые зависят от платформы или не являются универсальными.
- «Не платить за то, что не используется» — никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.
- Не требовать слишком усложнённой среды программирования.
C и C++
Синтаксис C++ унаследован от языка C. Хотя, формально, одним из принципов C++ остаётся сохранение совместимости с языком C, фактически группы по стандартизации этих языков не взаимодействуют, а вносимые ими изменения не только не коррелируют, но и нередко принципиально противоречат друг другу идеологически. Так, элементы, которые новые стандарты C добавляют в ядро, в стандарте C++ являются элементами стандартной библиотеки и в ядре вообще отсутствуют, например, динамические массивы, массивы с фиксированными границами, средства параллельной обработки. Как считает Страуструп, объединение разработки этих двух языков принесло бы большую пользу, но оно вряд ли возможно по политическим соображениям. Так что практическая совместимость между C и C++ постепенно будет утрачиваться.
В данном примере, в зависимости от используемого компилятора, будет выведено либо “C++”, либо “C”:
Связано это с тем, что символьные константы в C имеют тип int , а в C++ — тип char , но размеры этих типов различаются.
Модели жизненного цикла приложения
Жизненный цикл программного обеспечения — это период времени, который начинается с момента принятия решения о необходимости создания программного продукта и заканчивается в момент его полного изъятия из эксплуатации. Этот цикл — процесс построения и развития программного обеспечения (ПО). Существует несколько моделей жизненного цикла.
Каскадная модель жизненного цикла (англ. waterfall model) была предложена в 1970 г. Уинстоном Ройсом. Она предусматривает последовательное выполнение всех этапов проекта в строго фиксированном порядке. Переход на следующий этап означает полное завершение работ на предыдущем этапе. Требования, определенные на стадии формирования требований, строго документируются в виде технического задания и фиксируются на все время разработки проекта. Каждая стадия завершается выпуском полного комплекта документации, достаточной для того, чтобы разработка могла быть продолжена другой командой разработчиков.
Этапы проекта в соответствии с каскадной моделью:
- Формирование требований;
- Проектирование;
- Реализация;
- Тестирование;
- Внедрение;
- Эксплуатация и сопровождение.
В каскадной модели переход от одной фазы проекта к другой предполагает полную корректность результата предыдущей фазы. В больших проектах этого добиться практически невозможно. Поэтому такая модель пригодна только для разработки небольшого проекта. (Сам У. Ройс не придерживался данной модели и использовал модель итерационную).
Итерационная модель
Альтернативой каскадной модели является модель итеративной и инкрементальной разработки (англ. iterative and incremental development, IID), получившей от Т. Гилба в 70-е гг. название эволюционной модели. Модель IID предполагает разбиение жизненного цикла проекта на последовательность итераций, каждая из которых напоминает «мини-проект», включая все процессы разработки в применении к созданию меньших фрагментов функциональности, по сравнению с проектом в целом. Цель каждой итерации — получение работающей версии программной системы, включающей функциональность, определённую интегрированным содержанием всех предыдущих и текущей итерации. Результат финальной итерации содержит всю требуемую функциональность продукта. Таким образом, с завершением каждой итерации продукт получает приращение — инкремент — к его возможностям, которые, следовательно, развиваются эволюционно.
Различные варианты итерационного подхода реализованы в большинстве современных методологий разработки:
- Начальная стадия (Inception)
Определение масштабов проекта и объема необходимых ресурсов. Определяются основные требования, ограничения и ключевая функциональность продукта. Оцениваются риски. Планирование действий. При завершении начальной фазы оценивается достижение этапа жизненного цикла цели (англ. Lifecycle Objective Milestone), которое предполагает соглашение заинтересованных сторон о продолжении проекта.
Уточнение (Elaboration)
Документирование требований. Проектирование, реализация и тестирование исполняемой архитектуры. Уточнение сроков и стоимости. Снижение основных рисков. Успешное выполнение фазы разработки означает достижение этапа жизненного цикла архитектуры (англ. Lifecycle Architecture Milestone).
Построение (Construction)
В фазе «Построение» происходит реализация большей части функциональности продукта: дизайн приложения завершен, исходный код написан. Фаза Построение завершается первым внешним релизом системы и вехой начальной функциональной готовности (Initial Operational Capability).
Внедрение (Transition)
В фазе «Внедрение» создается финальная версия продукта и передается от разработчика к заказчику. Это включает в себя программу бета-тестирования, обучение пользователей, а также определение качества продукта. В случае, если качество не соответствует ожиданиям пользователей или критериям, установленным в фазе Начало, фаза Внедрение повторяется снова. Выполнение всех целей означает достижение вехи готового продукта (Product Release) и завершение полного цикла разработки.
Российский стандарт жизненного цикла ПО
Государственный стандарт подробно описывает жизненный цикл приложения в ГОСТ Р ИСО/МЭК 12207-2010 «Информационная технология. Системная и программная инженерия. Процессы жизненного цикла программных средств». Этот стандарт принят Федеральным агентством по техническому регулированию и метрологии РФ и аналогичен международному стандарту ISO/IEC 12207:2008. Данный стандарт, устанавливает общую структуру процессов жизненного цикла программных средств, на которую можно ориентироваться в программной индустрии. Стандарт не предлагает конкретную модель жизненного цикла. Его положения являются общими для любых моделей жизненного цикла, методов и технологий создания ПО. Он описывает структуру процессов жизненного цикла, не конкретизируя, как реализовать или выполнить действия и задачи, включенные в эти процессы.
Поддержка стандарта ISO C11 в компиляторах IBM XL C/C++
Новый стандарт языка программирования ISO C предоставляет несколько функциональных возможностей, повышающих эффективность программирования, облегчающих отладку и улучшающих производительность. Компиляторы IBM XL поддерживают новый стандарт C, поэтому вы можете воспользоваться преимуществами таких полезных возможностей, как поддержка инициализации объектов комплексных типов, статические утверждения и атрибуты функции для функций, не возвращающих управление. Теперь эти возможности являются частью компиляторов XL, что облегчает отладку и улучшает производительность.
Компиляторы IBM XL всегда строго соответствовали стандартам. В соответсттвии с неуклонной приверженностью IBM стандартам языков программирования в компиляторы IBM AIX XL C/C++ Version 12.1, Linux XL C/C++ Version 12.1 и BlueGene XL C/C++ Version 12.1 были добавлены новые функциональные возможности из нового стандарта ISO C (ISO/IEC 9899:2011, кодовое название C11). Это способствует переносимости и эффективности компиляторов серии XL, делает программирование на C и C++ более простым и эффективным при постоянных улучшениях производительности, которой славится семейство компиляторов XL.
Следуя за тенденцией развития языков программирования, расширения их функциональности, появления новых направлений, компиляторы XL тоже обновляются, чтобы обеспечить наилучшую производительность и удобство использования. В соответствии с этой тенденцией в оба компилятора (C и C++) были добавлены функции стандарта C11, что обеспечило переносимость исходного кода между языками и преимущества для программистов обоих направлений.
Были представлены новые повышающие эффективность работы программиста функциональные возможности, такие как инициализация комплексных значений, что облегчило инициализацию специальных комплексных чисел при помощи бесконечностей и NaN (не чисел). Статические утверждения помогают при отладке, как никогда упрощая создание высококачественных программ.
Для повышения производительности было добавлено ключевое слово _Noreturn для атрибута функции. Использование этого атрибута позволяет XL-компиляторам воспользоваться информацией о том, что функция никогда не возвращает управление, что способствует оптимизации и повышает скорость программ.
Все функциональные возможности C11 были добавлены под уровнем языка EXTC1X, поэтому первопроходцы могут сразу же воспользоваться преимуществами производительности и эффективности программирования, предлагаемыми C11.
Предыдущий стандарт C99 ввел в обращение комплексные типы с плавающей запятой для представления комплексных чисел. Это обеспечило средства для создания программ, которые могли работать с комплексными числами и производить вычисления с ними, использовать, принимать и выводить комплексные при необходимости значения. Компиляторы серии XL добавили к этому стандарту расширения, облегчившие работу с компонентами комплексных чисел (например, операторы __real__ и __imag__ ).
Несмотря на поддержку комплексных числе, обеспечиваемую стандартом C99 вместе с расширениями IBM, некоторын вещи все еще было трудно или невозможно делать с комплексными числами. Одной из ключевых недостающих возможностей было отсутствие способа инициализации комплексных чисел с указанием бесконечности или NaN в качестве мнимой единицы. Операторы __real__ и __imag__, предоставленные IBM, помогли решить эту проблему в контексте non-static и non-extern. Однако при файловой области действия или другой статической инициализации все еще не было простых средств для создания этих значений в определенных реализациях. Например, в случае, когда поддержка комплексных чисел не включает поддержку чисто мнимых чисел, которая не обязательна в стандарте C.
При использовании обязательной части поддержки комплексных чисел старого стандарта C99 можно было бы ожидать, что исходный код для получения комплексного числа 5.5 + Infinity i выглядел бы примерно так, как показано в листинге 1.
Однако в действительности данный код генерирует значение NaN + Infinity i . Причина в том, что __I сама по себе является не мнимой частью (чисто мнимым числом), а комплексным типом со значением мнимой части. Это тонкое отличие очень затрудняет инициализацию комплексных значений при помощи бесконечностей и NaN. Будь __I чисто мнимым числом, можно было бы применять обычное скалярное умножение для части INFINITY * __I этого выражения. Но, учитывая, что __I на самом деле является объектом комплексного типа, выполняется операция распространения типа (type promotion) с double на double _Complex для всех остальных элементов (включая INFINITY), и вместо скалярного выполняется комплексное умножение:
5.5 + INFINITY * __I
= (5.5 + 0 i ) + (INFINITY + 0 i ) * (0 + 1 i ) // Распространение типа
= (5.5 + 0 i ) + (INFINITY * 0) + (0 i * 0) + (INFINITY * 1 i ) + (0 i * 1 i ) // FOIL
= (5.5 + 0 i ) + (NaN) + () + (INFINITY i ) + () // Выполнение умножения
= (5.5 + NaN + 0 + 0) + (0 i + INFINITY i ) // Группирование элементов
= NaN + INFINITY i
Таким образом, мы получаем результат, совершенно непохожий на ожидаемый.
Поэтому для получения интуитивно ожидаемых значений в стандарт C11 была добавлена поддержка трех новых макросов инициализации, напоминающих функции:
Эти макросы принимают два аргумента: один для действительной части, а другой — для мнимой. Эти макросы можно использовать для статической инициализации, если сами аргументы поддерживают статическую инициализацию. Например, согласно стандарту C11 объект комплексного типа может быть инициализирован значением 5.0 + NaN i в любой области действия при помощи макроса CMPLX (см. листинг 2).
Эти макросы работают так, как будто используются следующие функции:
Язык программирования C++ (C++11). Лекции и упражнения
C++ Primer Plus, 6th Edition (Developer’s Library)
Stephen Prata
Эта книга представляет собой тщательно проверенный, качественно составленный и один из лучших учебников по языку программирования C++ (C++11) для программистов и разработчиков. Эта классическая книга по C++ обучает принципам программирования, среди которых структурированный код и нисходящее проектирование, а также использованию классов, наследования, шаблонов, исключений, лямбда-выражений, интеллектуальных указателей и семантики переноса.
Автор и преподаватель Стивен Прата создал поучительное, ясное и строгое введение в C++. Фундаментальные концепции программирования излагаются вместе с подробными сведениями о языке C++. Множество коротких практических примеров иллюстрируют одну или две концепции за раз, стимулируя читателей осваивать новые темы за счет непосредственной их проверки на практике.
Вопросы для самоконтроля и упражнения по программированию, предлагаемые в конце каждой главы, помогут читателям сосредоточиться на самой критически важной информации и систематизировать наиболее сложные концепции.
Написанное в дружественном стиле, простое в освоении руководство для самостоятельного изучения подойдет как студентам, обучающимся программированию, так и разработчикам, имеющим дело с другими языками и стремящимся лучше понять фундаментальные основы этого ключевого языка программирования.
Шестое издание этой книги обновлено и расширено с учетом последних тенденций в разработке на C++, а также для детального отражения нового стандарта языка C++11.
Эта книга отличается следующими особенностями
- Всеобъемлющее обсуждение классического языка C и дополнительных средств языка C++
- Строгое и ясное руководство по использованию каждой функциональной возможности
- Практическое обучение на кратких и простых примерах, которые развивают понимание одной или двух концепций за раз
- Сотни полезных примеров программ
- Вопросы для самоконтроля и упражнения по программированию, приводимые в конце каждой главы для самостоятельной проверки степени усвоения материала
- Освещение обобщенного языка C++ предоставляет максимально возможную гибкость
- Обучение стандарту ISO, включая обсуждение шаблонов, стандартной библиотеки шаблонов (STL), класса string, исключений, RTTI и пространств имен
Об авторе
Стивен Прата изучал астрономию, физику и вычислительную технику в Морском колледже (Кентфилд, Калифорния). Он получил степень бакалавра в Калифорнийском институте технологий и степень доктора философии в Университете Калифорнии в Беркли. Является автором и соавтором свыше десятка книг по программированию, среди которых New C Primer Plus, выигравшая в 1990 году номинацию лучшей справочной компьютерной книги (Computer Press Association’s 1990 Best How-to Computer Book Award), и C++ Primer Plus, в 1991 году выдвинутая на номинацию Computer Press Association’s Best How-to Computer Book Award.
1248 стр., с ил.; ISBN 978-5-8459-1778-2, 978-0-321-77640-2; формат 70×100/16; твердый переплет; тип бумаги: газетная; серия Landmark ; 2014, 4 кв.; Вильямс.
Понравилась книга? Порекомендуйте её друзьям и коллегам:
Заглавная страница
Прохождение Венеры по диску Солнца
Прохождение Венеры по диску Солнца — разновидность астрономического прохождения (транзита), — имеет место тогда, когда планета Венера находится точно между Солнцем и Землёй, закрывая собой крошечную часть солнечного диска. При этом планета выглядит с Земли как маленькое чёрное пятнышко, перемещающееся по Солнцу. Прохождения схожи с солнечными затмениями, когда наша звезда закрывается Луной, но хотя диаметр Венеры почти в 4 раза больше, чем у Луны, во время прохождения она выглядит примерно в 30 раз меньше Солнца, так как находится значительно дальше от Земли, чем Луна. Такой видимый размер Венеры делает её доступной для наблюдений даже невооружённым глазом (только с фильтрами от яркого солнечного света), в виде точки, на пределе разрешающей способности глаза. До наступления эпохи покорения космоса наблюдения этого явления позволили астрономам вычислить расстояние от Земли до Солнца методом параллакса, кроме того, при наблюдении прохождения 1761 года М. В. Ломоносов открыл атмосферу Венеры.
Продолжительность прохождения обычно составляет несколько часов (в 2004 году оно длилось 6 часов). В то же время, это одно из самых редких предсказуемых астрономических явлений. Каждые 243 года повторяются 4 прохождения: два в декабре (с разницей в 8 лет), затем промежуток в 121,5 года, ещё два в июне (опять с разницей 8 лет) и промежуток в 105,5 года. Последние декабрьские прохождения произошли 9 декабря 1874 года и 6 декабря 1882 года, а июньские — 8 июня 2004 года и 6 июня 2012 года. Последующие прохождения произойдут в 2117 и 2125 годах, опять в декабре. Во время прохождения наблюдается «явление Ломоносова», а также «эффект чёрной капли».
Резня в Благае
Резня в Благае (сербохорв. Масакр у Благају / Masakr u Blagaju ) — массовое убийство от 400 до 530 сербов хорватскими усташами, произошедшее 9 мая 1941 года, во время Второй мировой войны. Эта резня стала вторым по счету массовым убийством после создания Независимого государства Хорватия и была частью геноцида сербов.
Жертвами были сербы из села Велюн и его окрестностей, обвинённые в причастности к убийству местного мельника-хорвата Йосо Мравунаца и его семьи. Усташи утверждали, что убийство было совершено на почве национальной ненависти и свидетельствовало о начале сербского восстания. Задержанных сербов (их число, по разным оценкам, составило от 400 до 530 человек) содержали в одной из школ Благая, где многие из них подверглись пыткам и избиениям. Усташи планировали провести «народный суд», но оставшаяся в живых дочь Мравунаца не смогла опознать убийц среди задержанных сербов, а прокуратура отказалась возбуждать дело против кого-либо без доказательства вины. Один из высокопоставленных усташей Векослав Лубурич, недовольный таким развитием событий, организовал новый «специальный суд». День спустя дочь Мравунаца указала на одного из задержанных сербов. После этого 36 человек были расстреляны. Затем усташи казнили остальных задержанных.