编译器选项宏
这些宏控制特定的编译器功能。
宏 | 说明 |
---|---|
_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 简单对象向导。