编译器选项宏

这些宏控制特定的编译器功能。

说明
_ATL_ALL_WARNINGS 一个符号,用于在从旧版 ATL 转换的项目中启用错误。
_ATL_APARTMENT_THREADED 定义一个或多个对象是否使用单元线程。
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS 将特定的 CString 构造函数设为显式构造函数,防止任何意外转换。
_ATL_ENABLE_PTM_WARNING 定义此宏以要求使用 C++ 标准语法。 使用非标准语法初始化指向成员函数的指针时,此宏会生成 C4867 编译器错误。
_ATL_FREE_THREADED 定义一个或多个对象是否使用自由线程或中性线程。
_ATL_MODULES 允许编译具有 permissive- 的 ATL 项目,并将 ATL 与 C++ 模块一起使用。
_ATL_MULTI_THREADED 一个符号,指示项目是否具有标记为 Both、Free 或 Neutral 的对象。 应改为使用宏 _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“identifier”:标识符在调试信息中截断为“number”个字符

  • C4201 使用了非标准扩展:无名称的结构/联合

  • C4103“filename”:使用了 #pragma pack 来更改对齐方式

  • C4291“declaration”:未找到匹配的删除运算符;如果初始化引发异常,则不会释放内存

  • C4268“identifier”:用编译器生成的默认构造函数初始化的“const”静态/全局数据用零填充对象

  • C4702 无法访问的代码

在从旧版本转换的项目中,这些警告仍然由库标头禁用。

若要更改此行为,请在包含库标头之前将以下行添加到 pch.h(Visual Studio 2017 和更低版本中的 stdafx.h)文件。

#define _ATL_ALL_WARNINGS

如果添加此 #define,则 ATL 标头会谨慎保留这些警告的状态,以便不会将其全局禁用(如果用户显式禁用单个警告,则不启用该警告)。

默认情况下,新项目在 pch.h(Visual Studio 2017 和更低版本中的 stdafx.h)中设置了此 #define

_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++ 编译器的经改进标准 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 简单对象向导

_ATL_MODULES

允许编译具有 permissive- 的 ATL 项目,并将 ATL 与 C++ 模块一起使用。

_ATL_MODULES

_ATL_MULTI_THREADED

一个符号,指示项目是否具有标记为 Both、Free 或 Neutral 的对象。

_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 对象的线程模型的说明,请参阅选项,ATL 简单对象向导

另请参阅