pragma region c что это

Персональная страничка
Диканева Тараса
Викторовича

Миграция с Delphi на Visual C++

Введение

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

Delphi зарекомендовала себя как удобная среда для быстрого создания Windows-приложений с оконным интерфейсом. Из этой статьи вы узнаете, как делать то же самое на языке C++ в среде MS Visual Studio 2008. По счастью, принципы конструирования пользовательского интерфейса в последних версиях этой среды практически совпадают с теми, что присутствуют в Delphi.

Предполагается, что читатель хотя бы минимально знаком с синтаксисом языка C (без плюсов). В статье дается краткое описание работы с классами и объектами и ряда свойственных языку Visual C++ нововведений (пространства имен, управляемые указатели и пр.) Затем, рассказывается о создании пользовательского интерфейса и обработчиков событий. Также рассказано о том, как организовать ввод и вывод числовых параметров и, соответственно, о переводах строк в числа и наоборот.

Содержание

1. Установка среды

Если среда еще не установлена, скачиваем с Микрософтовского сайта бесплатную редакцию MS Visual Studio C++ 2008 Express.

Недавно вышла Visual Studio 2010, но ее скачивать не советую — там IntelliSence (подсказки названий методов и типов параметров) для языка C++ не работает.

Студию надо зарегистрировать (меню Help/Register product), иначе через месяц перестанет работать. Регистрация бесплатна.

Отличие от полной версии:
1) Среда содержит только один язык программирования.
2) Нет компилятора в 64 битный код.
3) Нет плагинов, дизайнера классов и некоторых других инструментов.

Полный список отличий смотрите здесь: Выпуски Visual C++

2. Некоторые предварительные сведения о языке C++

Чтобы понять, как создаются простейшие оконные приложения, мне пришлось разобраться с нижеперечисленными особенностями языка C++.

2.1. Пространства имен

Данный механизм используется, чтобы не было конфликтов между именами глобальных переменных, определенными в разных модулях программы. Любой блок программы можно поместить внутрь оператора:

Данный блок определяет пространство имен SampleName. Если мы захотим использовать любой идентификатор, описанный в этом блоке (например, переменную x), где-то за пределами блока, нам придется обращаться к нему как SampleName::x

Оператор :: носит название оператора глобального разрешения имен.

Если разместить в программе строку:

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

Пространства имен иерархичны. То есть, если например, написано

то к переменной x придется обращаться SampleName1::SampleName2::x.

2.2. Классы и объекты

Предполагается, что читатель знает, что такое классы, объекты и зачем это все нужно. Здесь лишь пример того, как это делается в C++.

Чтобы создать класс наследник пишем имя предка через двоеточие после имени класса:

Создать объект мы можем двумя способами:

В Delphi объекты (экземпляры класса) представляли собой указатели. Этому случаю соответствует второй вариант (PS). Объекты же S1 и S2 представляют собой обычные переменные, и при присваивании будет происходить копирование значений полей.

Указатель на объект можно описать, не создавая самого объекта:

В этом случае ему можно присвоить адрес другого объекта, например:

Обращения к полям и методам объекта – обычной переменной происходит, как в Delphi, через точку:

К элементам объекта-указателя можно обратиться предварительно разименовав его:

или сразу, используя оператор «->» (стрелка).

2.3. Управляемые указатели

Управляемые указатели появились, начиная с версии Visual C++ 2002. Основные отличия от обычных:
1) При описании такого указателя вместо знака * используется ^.
2) Выделенную по них память не надо освобождать – об этом позаботится автоматический сборщик мусора.
3) Для выделения памяти вместо new аналогично используется gcnew.

2.4. Статические поля и методы

Объявляя поле или метод в классе можно поставить перед ним слово static:

Статическое поле будет общим для всех объектов класса Sample. Изменив его у одного объекта, мы автоматически изменим его во всех остальных объектах. Задать его значение можно, даже когда ни одного объекта данного класса не создано. Для этого приставляем к его имени имя класса:

К статическому методу также можно обратиться, даже если объектов еще нет. Например, существует полезный класс Convert, содержащий статические методы для преобразования данных одного типа в другой. Например:

2.5. Сворачиваемая область #pragma region

Как всякая современная среда разработки Visual Studio дает возможность сворачивать и разворачивать отдельные блоки программы. Скажем, по умолчанию есть возможность свернуть описание класса или функции. Директива #pragma region позволяет явным образом ограничить кусок кода, который можно будет сворачивать и разворачивать:

Вместо RegionName следует поставить любой текст. Он будет отображаться, когда область свернута. Comment также замените на произвольный комментарий.

3. Создание оконного приложения

3.1. Создание приложения

Чтобы создать приложение с оконным интерфейсом, выберите пункт меню File \ New \ Project…. В появившемся диалоговом окне выполните действия, перечисленные на рисунке ниже:

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

После этого в центре экрана вы увидите закладку Form1.h [Design] с визуальным конструктором формы.

Нажав F5 можно скомпилировать и запустить проект. В результате вы увидите пустое окно вашей программы.

3.2. Конструирование интерфейса

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

Перейдите на закладку Form1.h [Design]. Вы увидите изображение пустой формы. Аналог палитры компонентов называется Toolbox (в русской версии «Панель элементов»). Попасть туда можно, нажав Ctrl – Alt – X или нажав на одноименную закладку, которая обычно располагается справа (см. рисунок).

Здесь вы увидите знакомые элементы вроде Button, Label, Checkbox и т.д. Хватайте их и тащите на изображение формы. Для примера давайте разместим на форме кнопку (Button), текстовое поле (TextBox) и надпись (Label).

Для просмотра свойств компонента выделите его мышкой и нажмите Alt – Enter. Появляющееся в результате окошко ничем не отличается от инспектора объектов. В верхней его части (см. рисунок) имеются две кнопки для переключения между списками свойств и событий.

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

Перейдите к списку событий для кнопки и двойным щелчком мыши напротив события Click создайте соответствующий обработчик. Для примера давайте по нажатию кнопки выводить в Label слова ”Hello, World!”. Для этого в обработчик события поместим инструкцию:

Обратите внимание, что все компоненты (в частности label1) являются управляемыми указателями. Соответственно, к их свойствам следует обращаться не через точку, а через стрелку «->».

Рассмотрите получившийся файл Form1.h. Приведенной в разделе 1 информации должно быть достаточно, чтобы понять смысл всего, что там теперь написано.

3.3. Преобразование числа в строку и обратно

Свойство Text имеет тип String^, то есть это управляемый указатель на объект типа String. Соответственно, чтобы организовать ввод/вывод числовых данных необходимо уметь преобразовывать строки в числа и наоборот. Для этого имеется полезный класс Convert, содержащий статические методы для преобразования значений одного типа в другой. Для нашей задачи полезными будут следующие методы:

ToString() – преобразует значения любого числового типа в значение типа String.

ToDouble() – преобразует строку в вещественное значение двойной точности (double).

ToSingle() – преобразует строку в вещественное значение одинарной точности (float).

ToInt32() – преобразует строку в значение типа int.

Для примера считаем числовое значение из компонента textBox, умножим его на 2, а результат поместим в label. Соответствующий обработчик событий будет выглядеть следующим образом:

Источник

Директивы препроцессора C#

Хотя у компилятора нет отдельного препроцессора, директивы, описанные в этом разделе, обрабатываются так, как если бы он был. Они используются в условной компиляции. В отличие от директив C и C++ вы не можете использовать их для создания макросов. Директива препроцессора должна быть единственной инструкцией в строке.

Контекст, допускающий значение NULL

Директива препроцессора #nullable устанавливает контекст с заметками о допустимости значений NULL и контекст с предупреждениями о допустимости значений NULL. Эта директива определяет, действуют ли заметки, допускающие значение NULL, и могут ли быть заданы предупреждения о допустимости значений NULL. Каждый контекст либо отключен, либо включен.

Оба контекста можно указать на уровне проекта (за пределами исходного кода C#). Директива #nullable управляет контекстами заметок и предупреждений и имеет приоритет над параметрами уровня проекта. Директива задает контексты, которыми управляет, пока другая директива не переопределит ее, или до конца исходного файла.

Ниже приведены результаты использования директив:

Условная компиляция

Для управления условной компиляцией используются четыре директивы препроцессора.

Для традиционных проектов, в которых не используется пакет SDK, необходимо вручную настроить символы условной компиляции для различных целевых платформ в Visual Studio с помощью страниц свойств проекта.

В следующем примере показано, как тестировать разные целевые платформы для использования более новых интерфейсов API, когда это возможно:

Определение символов

Используйте следующие две директивы препроцессора, чтобы определить или отменить определение символов для условной компиляции.

Директиву #define нельзя использовать для объявления значений констант, как это обычно делается в C и C++. Для определения констант в C# следует использовать статические элементы класса или структуры. При наличии нескольких констант имеет смысл создать для них отдельный класс «Constants».

Определение областей

Вы можете определить области кода, которые можно свернуть в структуру, используя следующие две директивы препроцессора.

Директива #region позволяет указать блок кода, который можно разворачивать и сворачивать с помощью функции структурирования в редакторе кода. В больших файлах кода удобно сворачивать или скрывать одну область или несколько, чтобы не отвлекаться от той части файла, над которой в настоящее время идет работа. В следующем примере показано, как определить область:

Сведения об ошибках и предупреждениях

Вы указываете компилятору создавать определенные пользователем ошибки и предупреждения компилятора, а также управлять сведениями о строках с помощью следующих директив.

#error позволяет создать определяемую пользователем ошибку CS1029 из определенного места в коде. Пример:

Компилятор обрабатывает #error version особым образом и сообщает об ошибке компилятора CS8304 с сообщением, содержащим используемые версии компилятора и языка.

#warning позволяет создать предупреждение компилятора CS1030 первого уровня из определенного места в коде. Пример:

Директива #line позволяет изменять номер строки компилятора и при необходимости имя файла, в который будут выводиться ошибки и предупреждения.

В следующем примере показано, как включить в отчет два предупреждения, связанные с номерами строк. Директива #line 200 принудительно устанавливает номер следующей строки 200 (по умолчанию используется номер 6). До выполнения следующей директивы #line в отчете будет указываться имя файла Special. Директива #line default по умолчанию восстанавливает нумерацию строк в исходное состояние с учетом строк, номера которых были изменены с помощью предшествующей директивы.

В результате компиляции формируются следующие результаты:

Директива #line hidden скрывает последующие строки для отладчика. В этом случае при пошаговой проверке кода разработчиком все строки между #line hidden и следующей директивой #line (кроме случаев, когда это также директива #line hidden ) будут пропущены. Этот параметр также можно использовать для того, чтобы дать ASP.NET возможность различать определяемый пользователем и создаваемый компьютером код. В основном эта функция используется в ASP.NET, но также может быть полезна и в других генераторах исходного кода.

Директива #line hidden не влияет на имена файлов и номера строк в отчетах об ошибках. Это значит, что при обнаружении ошибки в скрытом блоке компилятор укажет в отчете текущие имя файла и номер строки, где найдена ошибка.

Директива #line filename задает имя файла, которое будет отображаться в выходных данных компилятора. По умолчанию используется фактическое имя файла с исходным кодом. Имя файла должно заключаться в двойные кавычки (» «). Перед ним должен указываться номер строки.

Начиная с C# 10 можно использовать новую форму директивы #line :

Компоненты этой формы:

В предыдущем примере будет создано следующее предупреждение:

После повторного сопоставления переменная b находится в первой строке, в шестом символе.

Предметно-ориентированные языки (DSL) обычно используют этот формат, чтобы обеспечить более эффективное сопоставление исходного файла с созданными выходными данными C#. Дополнительные примеры этого формата см. в разделе примеров в спецификации функции.

Директивы pragma

Директива #pragma предоставляет компилятору специальные инструкции для компиляции файла, в котором она появляется. Компилятор должен поддерживать эти инструкции. Другими словами, директиву #pragma невозможно использовать для создания настраиваемых инструкций предварительной обработки.

pragma-name — имя распознанной прагмы, а pragma-arguments — аргументы, относящиеся к прагме.

#pragma warning

#pragma warning может включать или отключать определенные предупреждения.

warning-list — список номеров предупреждений с разделителем-запятой. Префикс CS является необязательным. Если номера предупреждений не указаны, disable отключает все предупреждения, а restore включает все предупреждения.

Чтобы найти номера предупреждений в Visual Studio, выполните сборку проекта, а затем поиск номеров предупреждений в окне Вывод.

#pragma checksum

Создает контрольные суммы для исходных файлов, чтобы помочь с отладкой страниц ASP.NET.

«filename» — это имя файла, для которого требуется наблюдение за изменениями или обновлениями, «» — глобальный уникальный идентификатор (GUID) для хэш-алгоритма, а «checksum_bytes» — строка шестнадцатеричных цифр, представляющих байты контрольной суммы. Должно быть четным числом шестнадцатеричных цифр. Нечетное число цифр приведет к выводу предупреждения во время компиляции, и директива будет пропущена.

Отладчик Visual Studio использует контрольную сумму, чтобы подтвердить нахождение правильного источника. Компилятор вычисляет контрольную сумму для исходного файла, а затем передает результат в файл базы данных (PDB) программы. Отладчик затем использует PDB-файл для сравнения с контрольной суммой, вычисленной им для исходного файла.

Это решение не работает для проектов ASP.NET, так как рассчитанная контрольная сумма относится к созданному исходному файлу, а не файлу ASPX. Чтобы решить эту проблему, #pragma checksum предоставляет поддержку контрольных сумм для страниц ASP.NET.

При создании проекта ASP.NET в Visual C# созданный исходный файл содержит контрольную сумму для ASPX-файла, из которого создается источник. Затем компилятор записывает эти данные в PDB-файл.

Если компилятор не обнаруживает директиву #pragma checksum в файле, он вычисляет контрольную сумму и записывает значение в PDB-файл.

Источник

Директивы препроцессора

В этом уроке мы узнаем о директивах препроцессора C#, а также о том, когда, почему и как они используются.

Как следует из названия, директивы препроцессора представляют собой блок операторов, который обрабатывается до начала компиляции.

Директивы препроцессора — это команды компилятора, которые влияют на процесс его работы.

Эти команды определяют, какие блоки кода нужно компилировать или как, например, обрабатывать определенные ошибки и предупреждения.

Директива

Описание

Синтаксис

Проверяет, является ли препроцессорное выражение истинным или нет.

Используется вместе с #if для проверки нескольких препроцессорных выражений.

Используется вместе с #if для создания условных ветвлений.

Используется вместе с #if для обозначения конца условной директивы.

Используется для определения идентификатора

Используется для отмены определения идентификатора.

Позволяет генерировать предупреждение 1 уровня из кода.

Позволяет генерировать ошибку из кода.

Используется для задания номера строки и имени файла, сообщаемого макросами препроцессора.

Позволяет обозначить область, которую можно развернуть или свернуть при использовании редактора кода Visual Studio.

Дает компилятору специальные инструкции для компиляции файла, в котором он работает.

Синтаксис

Пример использования

Здесь TESTING — это идентификатор.

Директива #if

Синтаксис

Пример использования

Пример 1. Используем директиву #if

Вывод:

В приведенной выше программе идентификатор CSHARP определяется с помощью директивы #define в начале программы. Внутри метода Main() директива #if используется для проверки истинности CSHARP. Блок кода внутри директивы #if компилируется, только если CSHARP определен.

Директива #elif

Синтаксис

Пример использования

Директива #else

Синтаксис

Пример использования

Директива #endif

Синтаксис

Пример использования

Пример 2. Используем условные директивы (#if, #elif, #else, #endif)

Вывод:

Директива #warning

Синтаксис

Пример 3. Используем директиву #warning

Вывод:

Обратите внимание, что операторы после директивы #warning также выполняются. Это означает, что директива #warning не завершает программу, а просто выдает предупреждение.

Директива #error

Синтаксис

Пример 4. Используем директиву #error

Вывод:

Директива #line

Синтаксис

Пример использования

Пример 5. Используем директиву #line

Вывод:

Директива #region и #endregion

Синтаксис

Пример 6. Используем директиву #region

Вывод:

Директива #pragma

Синтаксис

Пример использования

Пример 7. Используем директиву #pragma

Вывод:

Мы видим, что на экране отображается только второе предупреждение.

Так происходит, потому что мы изначально отключили все предупреждения перед первым предупреждением и восстановили их только перед вторым. По этой причине первое предупреждение было скрыто.

Мы также можем отключить конкретное предупреждение вместо всех предупреждений.

Источник

pragma, а __pragma также _Pragma Ключевые слова и

Директивы директивы pragma определяют функции компилятора, зависящие от конкретного компьютера или операционной системы. __pragma Ключевое слово, относящееся только к компилятору Майкрософт, позволяет создавать pragma директивы кода внутри определений макросов. Стандартный _Pragma Оператор препроцессора появился в C99 и принят в c++ 11.

Синтаксис

#pragma #pragma
__pragma( __pragma( ) токена два подчеркивания в начале — конкретное расширение Майкрософт
_Pragma( _Pragma( ) C99

Комментарии

Каждая реализация C и C++ поддерживает некоторые возможности, уникальные для хост-компьютера или операционной системы. Некоторые программы, например, должны выполнять точный контроль над расположением данных в памяти или управлять способом получения параметров определенными функциями. #pragma Директивы предлагают каждому компилятору возможность предоставлять функции для конкретного компьютера и операционной системы, сохраняя общую совместимость с языками C и C++.

Директивы директивы pragma зависят от конкретного компьютера или операционной системы и обычно отличаются для каждого компилятора. pragmaМожно использовать в условной директиве для предоставления новых функций препроцессора. Или используйте один из них, чтобы предоставить компилятору сведения, определяемые реализацией.

Компиляторы Microsoft C и C++ распознают следующие pragma директивы:

1 поддерживается только компилятором C++.

__pragma ключевое слово

В следующем примере кода показано, как __pragma ключевое слово может использоваться в макросе. Этот код взят из заголовка мфкдуал. h в образце ACDUAL в «примеры поддержки компилятора COM»:

_Pragma оператор предварительной обработки

Кавычки и обратные косые черты должны быть экранированы, как показано выше. pragmaСтрока, которая не распознана, игнорируется.

В следующем примере кода показано, как _Pragma ключевое слово можно использовать в макросе, похожем на утверждение. Он создает pragma директиву, которая подавляет предупреждение в случае, если условие выражения является константой.

Источник

Equivalent of #region for C++

What’s the C++ equivalent of #region for C++ so I can put in custom code collapsible bits and make my code a little easier to read?

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

11 Answers 11

Notable examples include Code::Blocks and FlashDevelop, and any other editor that uses the Scintilla editing component, such as Notepad++, Geany, Komodo Edit, and many more.

There isn’t an equivalent in C++. However IDEs should be able to collapse sections.

It is also possible to use something like this:

But probably not very portable

There is no equivalent. The #region feature is part of the C# specification.

C++ has no such equivalent. You could possibly mimic it with specially formatted comments, but this would be editor specific.

For Visual Studio you can use:

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

for several projects during the last couple of years and that suits me (including collapsible blocks). as an addition, i can disable the block using #define ANY_NAME_FOR_THIS_REGION just above it.

Just an addition to other answers. The region definition varies from IDE to IDE.

For Mac development in Xcode you can use a pragma:

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

C++Builder does support this, but you must declare the region as:

You must use end_region for C++Builder, but it will work, and it will collapse the region!

pragma region c что это. Смотреть фото pragma region c что это. Смотреть картинку pragma region c что это. Картинка про pragma region c что это. Фото pragma region c что это

Kate, KDevelop and all other text editors and IDEs which use Katepart supports marking regions with //BEGIN and //END markers.

You will be able to collapse a region defined in such way.

I use multiple blocks of namespace’d code with the same namespace. The IDE let’s me collapse by namespace block, so I just see the code of single block I’m working on e.g.

There is no equivalent.

Most good editors or IDEs will let you collapse functions, if not also if / else / while / for /etc.

The first answer from this question mentions another alternative. It is not applicable in all situations, though.

Method: Use <. >instead which natively supports code collapsing in Visual Studio.

Put your in different scopes <. >, then it will collapse the code in different scopes:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *