Поделиться через


Макросы для параметров компилятора

Эти макросы управляют определенными функциями компилятора.

Макрос 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, см. в разделе "Указание модели потоков проекта" для других параметров потоков и параметров.

См. также

Макросы