Макросы для параметров компилятора
Эти макросы управляют определенными функциями компилятора.
Макрос | Description |
---|---|
_ATL_ALL_WARNINGS |
Символ, который включает ошибки в проектах, преобразованных из предыдущих версий ATL. |
_ATL_APARTMENT_THREADED |
Определите, использует ли один или несколько объектов потоки квартир. |
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS |
Делает некоторые CString конструкторы явными, предотвращая непреднамеренные преобразования. |
_ATL_ENABLE_PTM_WARNING |
Определите этот макрос, чтобы требовать стандартный синтаксис C++. Он создает ошибку компилятора C4867 при использовании нестандартного синтаксиса для инициализации указателя на функцию-член. |
_ATL_FREE_THREADED |
Определите, использует ли один или несколько объектов бесплатный или нейтральный поток. |
_ATL_MODULES |
Позволяет компилировать проекты ATL с разрешительными и использовать ATL с модулями C++. |
_ATL_MULTI_THREADED |
Символ, указывающий, что проект имеет объекты, помеченные как "Оба", "Бесплатный" или "Нейтральный". Вместо этого следует использовать макрос _ATL_FREE_THREADED . |
_ATL_NO_AUTOMATIC_NAMESPACE |
Символ, который предотвращает использование пространства имен по умолчанию в качестве ATL. |
_ATL_NO_COM_SUPPORT |
Символ, который предотвращает компиляцию кода, связанного с COM, в проекте. |
ATL_NO_VTABLE |
Символ, который предотвращает инициализацию указателя vtable в конструкторе класса и деструкторе. |
ATL_NOINLINE |
Символ, указывающий, что функция не должна быть вложена. |
_ATL_SINGLE_THREADED |
Определите, используют ли все объекты одну модель потоков. |
_ATL_ALL_WARNINGS
Символ, который включает ошибки в проектах, преобразованных из предыдущих версий ATL.
#define _ATL_ALL_WARNINGS
Замечания
Перед Visual C++ .NET 2002 ATL отключил множество предупреждений и оставил их отключенными, чтобы они никогда не отображались в пользовательском коде. В частности:
Условное выражение C4127 является константным
C4786 "идентификатор": идентификатор усечен до символов "число" в сведениях отладки
Нестандартное расширение C4201 используется: безымяная структура или объединение
C4103 "filename": используется пакет #pragma для изменения выравнивания
C4291 "declaration": не найдено соответствующего оператора; память не освобождается, если инициализация создает исключение
C4268 "identifier" : "const" статические и глобальные данные, инициализированные с помощью конструктора, созданного компилятором по умолчанию, заполняет объект нулями
Неустранимый код C4702
В проектах, преобразованных из предыдущих версий, эти предупреждения по-прежнему отключены заголовками библиотек.
Чтобы изменить это поведение, добавьте следующую строку pch.h
в файл (stdafx.h
в Visual Studio 2017 и более ранних версиях) перед включением заголовков библиотек.
#define _ATL_ALL_WARNINGS
Если это #define
добавлено, заголовки ATL тщательно сохраняют состояние этих предупреждений, чтобы они не были отключены глобально (или если пользователь явным образом отключает отдельные предупреждения, а не включить их).
Новые проекты имеют этот #define
набор в pch.h (stdafx.h в Visual Studio 2017 и более ранних версиях) по умолчанию.
_ATL_APARTMENT_THREADED
Определите, использует ли один или несколько объектов потоки квартир.
_ATL_APARTMENT_THREADED
Замечания
Задает потоки квартир. Другие параметры и описание моделей потоков, доступных для объекта ATL, см. в разделе "Указание модели потоков и параметров проекта" мастера простых объектов ATL.
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
Делает некоторые CString
конструкторы явными, предотвращая непреднамеренные преобразования.
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
Замечания
При определении этого конструктора все CString
конструкторы, которые принимают один параметр, компилируются с явным ключевым словом, что предотвращает неявное преобразование входных аргументов. Это означает, например, что при _UNICODE
определении, если вы пытаетесь использовать char*
строку в качестве CString
аргумента конструктора, результаты ошибки компилятора. Используйте этот макрос в ситуациях, когда необходимо предотвратить неявное преобразование между узкими и широкими типами строк.
Используя _T
макрос для всех аргументов строки конструктора, можно определить _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
и избежать ошибок компиляции независимо от того, определен ли _UNICODE
он.
_ATL_ENABLE_PTM_WARNING
Определите этот макрос, чтобы принудительно использовать стандартный синтаксис ANSI C++ для указателя на функции-члены. Использование этого макроса приводит к возникновению ошибки компилятора C4867 при использовании нестандартного синтаксиса для инициализации указателя на функцию-член.
#define _ATL_ENABLE_PTM_WARNING
Замечания
Библиотеки ATL и MFC были изменены в соответствии с улучшенным соответствием компилятора Microsoft C++. Согласно стандарту ANSI C++ синтаксис указателя на функцию-член класса должен быть &CMyClass::MyFunc
.
Если _ATL_ENABLE_PTM_WARNING
не определено (по умолчанию), ATL/MFC отключает ошибку C4867 в картах макросов (особенно карты сообщений), чтобы код, созданный в более ранних версиях, продолжал создаваться как раньше. Если вы определяете _ATL_ENABLE_PTM_WARNING
, код должен соответствовать стандарту C++.
Однако нестандартная форма устарела. Необходимо переместить существующий код в стандартный синтаксис C++. Например, приведенный ниже код
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, OnMycommand)
END_MESSAGE_MAP()
следует изменить на
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand)
END_MESSAGE_MAP()
Для макросов карты добавьте символ амперсанда '&'. Не следует снова добавлять символ в код.
_ATL_FREE_THREADED
Определите, использует ли один или несколько объектов бесплатный или нейтральный поток.
_ATL_FREE_THREADED
Замечания
Задает свободный поток. Бесплатная потоковая работа эквивалентна многопоточной модели квартиры. Дополнительные сведения о моделях потоков, доступных для объекта ATL, см. в разделе "Указание модели потоков проекта" для других параметров потоков и параметров.
_ATL_MODULES
Позволяет компилировать проекты ATL и использовать ATL с permissive-
модулями C++.
_ATL_MODULES
_ATL_MULTI_THREADED
Символ, указывающий, что проект имеет объекты, помеченные как "Оба", "Бесплатный" или "Нейтральный".
_ATL_MULTI_THREADED
Замечания
Если этот символ определен, ATL извлекает код, который будет правильно синхронизировать доступ к глобальным данным. Вместо этого новый код должен использовать эквивалентный макрос _ATL_FREE_THREADED
.
_ATL_NO_AUTOMATIC_NAMESPACE
Символ, который предотвращает использование пространства имен по умолчанию в качестве ATL.
_ATL_NO_AUTOMATIC_NAMESPACE
Замечания
Если этот символ не определен, в том числе atlbase.h
выполняется using namespace ATL
по умолчанию, что может привести к конфликтам именования. Чтобы предотвратить это, определите этот символ.
_ATL_NO_COM_SUPPORT
Символ, который предотвращает компиляцию кода, связанного с COM, в проекте.
_ATL_NO_COM_SUPPORT
ATL_NO_VTABLE
Символ, который предотвращает инициализацию указателя vtable в конструкторе класса и деструкторе.
ATL_NO_VTABLE
Замечания
Если указатель vtable не будет инициализирован в конструкторе класса и деструкторе, компоновщик может исключить vtable и все функции, к которым он указывает. Разворачивается в __declspec(novtable)
.
Пример
class ATL_NO_VTABLE CMyClass2 :
ATL_NOINLINE
Символ, указывающий, что функция не должна быть вложена.
ATL_NOINLINE inline
myfunction()
{
...
}
Параметры
myfunction
Функция, которая не должна быть вложена.
Замечания
Используйте этот символ, если вы хотите убедиться, что функция не встраиваться компилятором, даже если она должна быть объявлена как встроенная, чтобы она была помещена в файл заголовка. Разворачивается в __declspec(noinline)
.
_ATL_SINGLE_THREADED
Определите, используют ли все объекты одну модель потоков
_ATL_SINGLE_THREADED
Замечания
Указывает, что объект всегда выполняется в основном потоке COM. Дополнительные сведения о моделях потоков, доступных для объекта ATL, см. в разделе "Указание модели потоков проекта" для других параметров потоков и параметров.