boost编译开关宏参考手册(中文)

http://boost.ez2learn.com/libs/config/doc/html/boost_config/boost_macro_reference.html

以下宏都是用于描述C++标准所要求的某个特性的,如果下面当中的某一个宏被定义,则表示该编译器存在一个与标准不符的缺陷。

说明

BOOST_BCB_PARTIAL_SPECIALIZATION_BUG

编译器

编译器存在某些偏特化方面的缺陷 - 很可能是 Borland C++ Builder.

BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL

编译器

如果在当前域中有对被查找符号的 using 声明,则ADL查找失败。例如,using boost::get_pointer; 将阻止使用 ADL 在 boost 内部的名字空间中(但是可以在其它地方)查找 get_pointer 的重载。可能是 Borland 的特殊方式。

BOOST_NO_ADL_BARRIER

编译器

编译器定位并查找那些在执行参数相关查找时实际上不应查找的名字空间。

BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP

编译器

编译器没有实现ADL(又称Koenig查找); 请见 std::3.4.2 [basic.koenig.lookup]

BOOST_NO_AUTO_PTR

标准库

如果编译器/标准库提供非标准或有问题的  std::auto_ptr.

BOOST_NO_CTYPE_FUNCTIONS

平台

平台不提供字符分类操作的函数 <ctype.h> 和 <cctype>, 只提供了相应的宏。

BOOST_NO_CV_SPECIALIZATIONS

编译器

如果针对cv-限定类型的模板特化与针对非cv-限定类型的特化冲突。

BOOST_NO_CV_VOID_SPECIALIZATIONS

编译器

如果针对cv-void类型的模板特化与针对void的特化冲突。

BOOST_NO_CWCHAR

平台

平台不提供 <wchar.h> 和 <cwchar>.

BOOST_NO_CWCTYPE

平台

平台不提供 <wctype.h> 和 <cwctype>.

BOOST_NO_DEPENDENT_NESTED_DERIVATIONS

编译器

编译器不能编译带有受限基类的嵌套类: 

template<typename T>
struct foo : {
template<typename U>
struct bar : public U {};

};

BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS

编译器

模板值参数不能为受限类型,例如: 

template<class T, typename T::type value> 
class X { ... };

BOOST_NO_EXCEPTION_STD_NAMESPACE

标准库

标准库未将 <exception> 的一些或全部内容置于名字空间 std 中。

BOOST_NO_EXCEPTIONS

编译器

编译器不支持异常处理(多数嵌入式平台的C++编译器都要求这一设置)。注意,并不要求 boost 库一定要遵守这一配置设置 - 在某些情形下这样做是不可能的。遵守这一设置的库通常在发生严重错误时会退出 - 已经警告你了!

BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS

编译器

在调用函数模板实例时只能使用被推导的模板参数。

BOOST_NO_FUNCTION_TEMPLATE_ORDERING

编译器

编译器不执行函数模板分类(function template ordering)或执行的方法不正确。 

// #1
template<class T> void f(T);
// #2
template<class T,class U> void f(T(*)(U));
void bar(int);
f(&bar); // 应选择 #2.

BOOST_NO_INCLASS_MEMBER_INITIALIZATION

编译器

编译器违犯 std::9.4.2/4.

BOOST_NO_INTRINSIC_WCHAR_T

编译器

C++实现不提供 wchar_t, 或者它只是另一个整型类型的别名。使用这一符号来决定在已经有一个针对该整型类型的特化时是否适合再定义针对 wchar_t 的特化。

BOOST_NO_IOSFWD

标准库

标准库缺少 <iosfwd>.

BOOST_NO_IOSTREAM

标准库

标准库缺少 <iostream><istream> 或 <ostream>.

BOOST_NO_IS_ABSTRACT

编译器

C++编译器不支持抽像类型的 SFINAE, 见 Core Language DR337, 不过它当前还未加入标准。幸好多数编译器支持 SFINAE 也支持这份 DR.

BOOST_NO_LIMITS

标准库

C++实现不提供 <limits> 头文件。在库代码中从不检查该符号;它总是包含 <boost/limits.hpp>, 以保证提供 std::numeric_limits

BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS

标准库

在编译期,像 numeric_limits<T>::is_signed 这样的常量不可用。

BOOST_NO_LONG_LONG_NUMERIC_LIMITS

标准库

没有 numeric_limits<long long> 和 numeric_limits<unsigned long long> 的特化。仅当编译器支持 long long 类型时,<boost/limits.hpp> 会 将这两个特化作为标准库的"修正"。

BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS

编译器

编译器不支持模板类的单独成员函数特化。

BOOST_NO_MEMBER_TEMPLATE_KEYWORD

编译器

如果编译器支持成员模板,但是在访问成员模板类时不使用 template 关键字。

BOOST_NO_MEMBER_TEMPLATE_FRIENDS

编译器

不支持C++标准 14.5.3 所描述的成员模板友元语法 (template<class P> friend class frd;)

BOOST_NO_MEMBER_TEMPLATES

编译器

不完全支持成员模板函数。

BOOST_NO_MS_INT64_NUMERIC_LIMITS

标准库

没有 numeric_limits<__int64> 和 numeric_limits<unsigned __int64> 的特化。仅当编译器支持 __int64 类型时,<boost/limits.hpp> 会 将这两个特化作为标准库的"修正"。

BOOST_NO_OPERATORS_IN_NAMESPACE

编译器

编译器要求继承的操作符友元函数在名字空间域中定义,然后 using 给 boost. 可能是 GCC 的特殊方式。相关例子请见 <boost/operators.hpp>

BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS

编译器

编译器不能正确处理那些依赖于主模板中的缺省参数的偏特化。

BOOST_NO_POINTER_TO_MEMBER_CONST

编译器

编译器不能正确处理常量成员函数的指针,要防止在重载函数模板时使用它们。相关例子请见 <boost/functional.hpp>

BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS

编译器

成员指针不能作为模板参数使用。

BOOST_NO_PRIVATE_IN_AGGREGATE

编译器

编译器误读了 8.5.1, 将含私有或保护的成员函数的类视为 non-aggregate.

BOOST_NO_SFINAE

编译器

编译器不支持 "Substitution Failure Is Not An Error" 的元编程惯用法。

BOOST_NO_STD_ALLOCATOR

标准库

C++标准库没有提供符合标准的 std::allocator.

BOOST_NO_STD_DISTANCE

标准库

平台没有符合标准的 std::distance 版本。.

BOOST_NO_STD_ITERATOR

标准库

C++ 实现不提供 std::iterator 类。

BOOST_NO_STD_ITERATOR_TRAITS

标准库

编译器不提供符合标准的 std::iterator_traits 实现。注意,编译器有可能提供非标准的实现。

BOOST_NO_STD_LOCALE

标准库

标准库没有 std::locale.

BOOST_NO_STD_MESSAGES

标准库

标准库没有符合标准的 std::messages facet.

BOOST_NO_STD_MIN_MAX

标准库

C++标准库不提供 min() 和 max() 模板函数,它们应该在 <algorithm> 中。 

BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN

标准库

如果标准库的输出迭代器不是可赋值的,就定义它。

BOOST_NO_STD_TYPEINFO

标准库

<typeinfo> 头文件将 type_info 声明在全局名字空间而不是 namespace std.

BOOST_NO_STD_USE_FACET

标准库

标准库没有符合标准的 std::use_facet.

BOOST_NO_STD_WSTREAMBUF

标准库

标准库没有 std::basic_streambuf<wchar_t> 的实现,或者不完整,或者有缺陷。

BOOST_NO_STD_WSTRING

标准库

标准库没有 std::wstring.

BOOST_NO_STDC_NAMESPACE

编译器, 平台

C++中的C库函数标准头文件(即 <c...> 头文件)中的内容没有位于名字空间 std. 这个测试是很困难的 - 有些"假装"为标准C函数的库通过增加 using 声明来导入这些函数到名字空间 std, 不幸的是它们没有覆盖所有函数... 

BOOST_NO_STRINGSTREAM

标准库

C++实现不提供 <sstream> 头文件。

BOOST_NO_SWPRINTF

平台

平台没有符合标准的  swprintf 版本。

BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION

编译器

不支持类模板偏特化(14.5.4 [temp.class.spec]).

BOOST_NO_TEMPLATED_IOSTREAMS

标准库

标准库不提供模板化的 iostream 类。

BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS

标准库

标准库没有为容器提供模板化的迭代器结构函数。

BOOST_NO_TEMPLATE_TEMPLATES

编译器

编译器不支持模板模板参数。

BOOST_NO_TYPEID

编译器

编译器根本不支持 typeid 操作符。

BOOST_NO_UNREACHABLE_RETURN_DETECTION

编译器

如果 return 语句不可到达,则不要求必须有 return 语句,但是有些编译器坚持要有,如果发生这种情形,会导致一串警告。

BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE

编译器

编译器不接受用 using 声明将一个函数从基类的 typename 带入到派生类中,如果派生类中已经有同名的函数。

BOOST_NO_USING_TEMPLATE

编译器

编译器不接受用 using 声明将一个模板类或模板函数从另一个名字空间导入。原本 Borland 存在导入到全局名字空间或从全局名字空间导入的问题,后来扩展以 MSVC6,它存在导入模板类(但不是模板函数)的问题。

BOOST_NO_VOID_RETURNS

编译器

编译器不允许一个 void 函数返回对另一个 void 函数的调用结果。 

void f() {}
void g() { return f(); }

以下宏描述了不被C++标准要求的一些特性。该宏只在该特性存在时被定义。

说明

BOOST_HAS_BETHREADS

平台

平台支持 BeOS 风格的线程。

BOOST_HAS_CLOCK_GETTIME

平台

平台有 POSIX API clock_gettime.

BOOST_HAS_DECLSPEC

编译器

编译器用 __declspec(dllexport) 和 __declspec(dllimport) 来从 dll 导出/导入 符号。

BOOST_HAS_DIRENT_H

平台

平台有 POSIX 头文件 <dirent.h>.

BOOST_HAS_EXPM1

平台

平台有函数 expm1expm1f 和 expm1l, 它们在 <math.h> 中。

BOOST_HAS_FTIME

平台

平台有 Win32 API GetSystemTimeAsFileTime.

BOOST_HAS_GETTIMEOFDAY

平台

平台有 POSIX API gettimeofday.

BOOST_HAS_HASH

标准库

C++实现提供了 (SGI) hash_set 和 hash_map 类。该宏被定义时,BOOST_HASH_SET_HEADER 和 BOOST_HASH_LIST_HEADER 将包含访问 hash_set 和 hash_map 所需的头文件名;BOOST_STD_EXTENSION_NAMESPACE 将提供这两个类模板所处的名字空间。

BOOST_HAS_LOG1P

平台

平台有函数 log1plog1pf 和 log1pl, 它们在 <math.h> 中。

BOOST_HAS_MACRO_USE_FACET

标准库

标准库没有符合标准的 std::use_facet, 但是有一个宏 _USE(loc, Type) 来完成这一工作。主要用于 Dinkumware 标准库。

BOOST_HAS_MS_INT64

编译器

编译器支持 __int64 数据类型。

BOOST_HAS_NANOSLEEP

平台

平台有 POSIX API nanosleep.

BOOST_HAS_NL_TYPES_H

平台

平台有 <nl_types.h>.

BOOST_HAS_NRVO

编译器

表示编译器支持具名返回值优化(NRVO). 用于为某些函数选择最高效的实现。相关例子请见 <boost/operators.hpp>

BOOST_HAS_PARTIAL_STD_ALLOCATOR

标准库

标准库有部分符合标准的 std::allocator 类,但没有任何成员模板。

BOOST_HAS_PTHREAD_DELAY_NP

平台

平台有 POSIX API pthread_delay_np.

BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE

平台

平台有 POSIX API pthread_mutexattr_settype.

BOOST_HAS_PTHREAD_YIELD

平台

平台有 POSIX API pthread_yield.

BOOST_HAS_PTHREADS

平台

平台支持 POSIX 风格的线程。

BOOST_HAS_SCHED_YIELD

平台

平台有 POSIX API sched_yield.

BOOST_HAS_SGI_TYPE_TRAITS

编译器, 标准库

编译器有对 SGI 风格的 type traits 有原生支持。

BOOST_HAS_STDINT_H

平台

平台有 <stdint.h>

BOOST_HAS_SLIST

标准库

C++实现提供了 (SGI) slist 类。该宏被定义时,OOST_SLIST_HEADER 将包含访问 slist 所需的头文件名,BOOST_STD_EXTENSION_NAMESPACE 提供了 slist 所处的名字空间。

BOOST_HAS_STLP_USE_FACET

标准库

标准库没有符合标准的 std::use_facet, 但有完成这一工作的变通版本的类。主要用于 STLport 标准库。

BOOST_HAS_TR1_ARRAY

标准库

标准库有符合 TR1 的 <array> 版本。.

BOOST_HAS_TR1_COMPLEX_OVERLOADS

标准库

标准库的 <complex> 支持传入标量给复数算法。

BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG

标准库

标准库的 <complex> 包含 TR1 的新逆 trig 函数。 

BOOST_HAS_TR1_REFERENCE_WRAPPER

标准库

标准库有符合 TR1 的引用包装器,在 <functional> 中。

BOOST_HAS_TR1_RESULT_OF

标准库

标准库有符合 TR1 的 result_of 模板,在 <functional> 中。 

BOOST_HAS_TR1_MEM_FN

标准库

标准库有符合 TR1 的 mem_fn 函数模板,在 <functional> 中。

BOOST_HAS_TR1_BIND

标准库

标准库有符合 TR1 的 bind 函数模板,在 <functional> 中。

BOOST_HAS_TR1_FUNCTION

标准库

标准库有符合 TR1 的 function 类模板,在 <functional> 中。

BOOST_HAS_TR1_HASH

标准库

标准库有符合 TR1 的 hash 函数模板,在 <functional> 中。

BOOST_HAS_TR1_SHARED_PTR

标准库

标准库有符合 TR1 的 shared_ptr 类模板,在 <memory> 中。 

BOOST_HAS_TR1_RANDOM

标准库

标准库有符合 TR1 的 <random> 版本。

BOOST_HAS_TR1_REGEX

标准库

标准库有符合 TR1 的 <regex> 版本。

BOOST_HAS_TR1_TUPLE

标准库

标准库有符合 TR1 的 <tuple> 版本。 

BOOST_HAS_TR1_TYPE_TRAITS

标准库

标准库有符合 TR1 的 <type_traits> 版本。

BOOST_HAS_TR1_UTILITY

标准库

标准库有符合 TR1 的对 <utility> 的补充(对 std::pair 的 tuple 接口)。 

BOOST_HAS_TR1_UNORDERED_MAP

标准库

标准库有符合 TR1 的 <unordered_map> 版本。.

BOOST_HAS_TR1_UNORDERED_SET

标准库

标准库有符合 TR1 的 <unordered_set> 版本。

BOOST_HAS_TR1

标准库

表示所有其它 BOOST_HAS_TR1_* 宏均被设置。

BOOST_HAS_THREADS

平台, 编译器

如果编译器在当前编译模式下支持多线程执行,则被定义。

BOOST_HAS_TWO_ARG_USE_FACET

标准库

标准库没有符合标准的 std::use_facet, 但有完成该工作的两参数版本。主要用于 Rogue Wave 标准库。

BOOST_HAS_UNISTD_H

平台

平台提供了 <unistd.h>.

BOOST_HAS_WINTHREADS

平台

平台支持 MS Windows 风格的线程。

BOOST_MSVC_STD_ITERATOR

标准库

使用的是 Microsoft 的有问题的 std::iterator 版本。相当于 std::iterator 不能接受两个以上模板参数。

BOOST_MSVC6_MEMBER_TEMPLATES

编译器

Microsoft Visual C++ 6.0 的成员模板特性(客气地说)足以定义 BOOST_NO_MEMBER_TEMPLATES. 定义 BOOST_MSVC6_MEMBER_TEMPLATES 可以采用编译器一些特定的变通方法。如果未定义 BOOST_NO_MEMBER_TEMPLATES 则会自动定义该宏 - 换言之,它被作标准要求的一个严格子集来处理。

BOOST_HAS_STDINT_H

平台

1998 C++ 标准中没有头文件 <stdint.h> 或 <cstdint>, 虽然 1999 C 标准中包含了 <stdint.h>. 如果有 <stdint.h><boost/stdint.h> 就可以很好地使用它,所以提供了这个标志(作为信号使用;缺省是没有的,这符合当前的 C++ 标准)。

以下宏描述了很可能被包含在即将到来的 ISO C++ 标准 C++0x 中,但尚未经批准加入到语言中的一些特性。

说明

BOOST_HAS_CONCEPTS

编译器支持概念。

以下宏描述了在即将到来的 ISO C++ 标准 C++0x 中,但尚未被某个特定编译器支持的一些特性。

说明

BOOST_NO_CHAR16_T

编译器不支持类型 char16_t.

BOOST_NO_CHAR32_T

编译器不支持类型 char32_t.

BOOST_NO_CONSTEXPR

编译器不支持 constexpr.

BOOST_NO_DECLTYPE

编译器不支持 decltype.

BOOST_NO_DEFAULTED_FUNCTIONS

编译器不支持缺省(= default) 函数。

BOOST_NO_DELETED_FUNCTIONS 编译器不支持已删(= delete) 函数。

BOOST_NO_EXPLICIT_CONVERSION_OPERATIONS

编译器不支持显式转换操作符(explicit operator T()).

BOOST_NO_EXTERN_TEMPLATE

编译器不支持模板显式实例化声明 (explicit template).

BOOST_NO_LONG_LONG

编译器不支持 long long.

BOOST_NO_RAW_LITERALS

编译器不支持裸字符串文字。

BOOST_NO_RVALUE_REFERENCES

编译器不支持右值引用。

BOOST_NO_SCOPED_ENUMS

编译器不支持定域枚举(enum class).

BOOST_NO_STATIC_ASSERT

编译器不支持 static_assert.

BOOST_NO_UNICODE_LITERALS

编译器不支持 Unicode (u8uU#)文字。

BOOST_NO_VARIADIC_TEMPLATES

编译器不支持可变参数数量的模板。

以下宏为简单的辅助宏,或是为编译器/标准库的缺陷提供变通方法的宏。

说明

BOOST_DEDUCED_TYPENAME

有些编译器不支持推断上下文中为受限类型使用 typename. 在这些编译器中,该宏扩展为空,而在其它编译器中则扩展为 typename. 例如,将:  template <class T> void f(T, typename T::type); 替换为 template <class T> void f(T,BOOST_DEDUCED_TYPENAME T::type);

BOOST_HASH_MAP_HEADER

包含获得 SGI hash_map 类的头文件。该宏仅在 BOOST_HAS_HASH 被定义时有效。

BOOST_HASH_SET_HEADER

包含获得 SGI hash_set 类的头文件。该宏仅在 BOOST_HAS_HASH 被定义时有效。

BOOST_SLIST_HEADER

包含获得 SGI slist 类的头文件。该宏仅在 BOOST_HAS_SLIST 被定义时有效。

BOOST_STD_EXTENSION_NAMESPACE

用于标准库扩展(hashtable 类等)的名字空间。

BOOST_STATIC_CONSTANT(Type, assignment)

在不允许类中静态整型常量成员初始化的编译器上,我们必须使用 enums 作为变通的方法,如果我们想获得编译期的常量。该宏给了我们一个方便的方法来声明这样的常量。例如,将: 

struct foo{
static const int value = 2;
};

替换为:

struct foo{
BOOST_STATIC_CONSTANT(int, value = 2);
};

BOOST_UNREACHABLE_RETURN(result)

一般被扩展为空,但如果编译器要求即使不可到达也要一个返回语句,则扩展为 return x; 

BOOST_EXPLICIT_TEMPLATE_TYPE(t)BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t,v)BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t,v)

有些编译器在模板参数未出现在函数参数列表中时,会自动将不同的函数模板实例"折叠"起来。例如: 

#include <iostream>
#include <ostream>
#include <typeinfo>
template <int n>
void f() { std::cout << n << ' '; }
template <typename T>
void g() { std::cout << typeid(T).name() << ' '; }
int main() {
f<1>();
f<2>();
g<int>();
g<double>();
}

在VC++ 6上会错误地输出 "2 2 double double ". 这些宏可以在函数参数列表中使用,修正这一问题且不影响调用的语法。例如,将上例改写为: 

template <int n>
void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... }
template <typename T>
void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... }

它们会声明(对于受影响的编译器)一个虚拟的缺省参数,所以它们

a) 被调用时总会带上参数列表 
b) 如果你的函数模板有多份声明就不可使用。 

此外,为了加上必要的逗号分隔符,当这些宏在普通的参数声明之后或同一组的其它宏调用之后出现,必须使用 "APPEND_*" 版本。

BOOST_USE_FACET(Type, loc)

如果标准库没有符合标准的 std::use_facet,可以有多种普 通方法,每个库各不相同。该宏提供了一个简便的方法来访问某个 locale 的 facets. 例如,将:std::use_facet<Type>(loc); 替换为 BOOST_USE_FACET(Type, loc); 注意,不要在  BOOST_USE_FACET 之前加上 std:: 前缀。

BOOST_HAS_FACET(Type, loc)

如果标准库没有符合标准的 std::has_facet,可以有多种普 通方法,每个库各不相同。该宏提供了一个简便的方法来检查某个 locale 的 facets. 例如,将:std::has_facet<Type>(loc); 替换为 BOOST_HAS_FACET(Type, loc); 注意,不要在 BOOST_HAS_FACET 之前加上 std:: 前缀。

BOOST_NESTED_TEMPLATE

有些支持成员模板的编译器并不能使用 A::template member<U> 语法,作为变通的方法,可以将:typedef typename A::templaterebind<U> binder; 替换为 typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;

BOOST_STRINGIZE(X)

在对 X 执行宏替换后,将它转换为一个字符串。

BOOST_JOIN(X,Y)

该宏将两个参数联接起来,即使其中有的参数本身也是宏(请见C++标准的16.3.1)。可用于创建一个名字与象 __LINE__ 这样的预定义宏结合。

以下宏描述了一些 boost 特性;一般来说,这些 boost 宏只用于在用户代码中进行检测之用。

头文件

说明

BOOST_VERSION

<boost/version.hpp>

以 XXYYZZ 格式描述 boost 版本号如下:(BOOST_VERSION % 100) 为子版本号,((BOOST_VERSION / 100) % 1000) 为次版本号,(BOOST_VERSION / 100000) 为主版本号。

BOOST_NO_INT64_T

<boost/cstdint.hpp><boost/stdint.h>

没有64位整数类型 int64_tuint64_t 等时被定义。

BOOST_NO_INTEGRAL_INT64_T

<boost/cstdint.hpp><boost/stdint.h>

如果在 <boost/cstdint.hpp> 中定义的 int64_t 不可用于整型常量表达式,则定义该宏。

BOOST_MSVC

<boost/config.hpp>

如果编译器为 Microsoft Visual C++, 但不是其它定义了 _MSC_VER 的编译器,则定义该宏。

BOOST_INTEL

<boost/config.hpp>

如果编译器为 Intel compiler, 则定义该宏,其中带有与编译器版本宏相同的值。

BOOST_WINDOWS

<boost/config.hpp>

如果 Windows 平台 API 可用,则定义该宏。

BOOST_DINKUMWARE_STDLIB

<boost/config.hpp>

如果使用的是 dinkumware 标准库,则定义该宏,如果 Dinkumware 库版本宏 _CPPLIB_VER 被定义,则带有与之相同的值,否则为 1.

BOOST_NO_WREGEX

<boost/regex.hpp>

如果 regex 库不支持宽字符正则表达式,则定义该宏。

BOOST_COMPILER

<boost/config.hpp>

定义为一个字符串,描述在用编译器的名字和版本。主要用于验证配置。

BOOST_STDLIB

<boost/config.hpp>

定义为一个字符串,描述在用标准库的名字和版本。主要用于验证配置。

BOOST_PLATFORM

<boost/config.hpp>

定义为一个字符串,描述平台的名字。主要用于验证配置。

以下宏和辅助头文件专门给那些包含独立源代码的库的作者使用,其目的是解决两个问题:修正被编译库的ABI,以及根据编译器的设置选择 哪一个已编译的库进行链接。

在与一个预编译的库进行链接时,关键是构建该库时编译器所用的ABI必须与使用该库的代码所用的ABI严格匹配。这里的ABI指的是, 象结构压缩排 列、命名扰乱机制、某些类型的大小(如 enum 类型)等东西。这些东西与线程支持、运行期库的变化等是分离的,后者必须通过构建变量来处理。为了解释得更清楚,一个编译器(如Borland的)有许多 编译器选项会对ABI造成很微妙的影响,理论上至少有3200种组合,这还没有考虑运行期库的变化。幸好,这些变量可以通过  #pragma 来管理,告诉编译器在你的库中所声明的类型使用了怎样的ABI。为了避免在 boost 头文件中到处出现  #pragma, 我们用一些前缀头文件和后缀头文件来完成这项工作。典型的用法如下:

my_library.hpp

#ifndef MY_INCLUDE_GUARD
#define MY_INCLUDE_GUARD
// 这里是要包含的头文件:
#include <boost/config.hpp>
#include <whatever>
#include <boost/config/abi_prefix.hpp> // 必须是最后一个 #include

namespace boost {
// 这里是你的代码

}
#include <boost/config/abi_suffix.hpp> // 弹出 abi_prefix.hpp 的 pragmas

#endif // include guard

my_library.cpp

...
// 在实现文件中不需要任何特殊处理
...

用户可以通过定义 BOOST_DISABLE_ABI_HEADERS 来禁止这一机制,或者他们可以定义 BOOST_ABI_PREFIX 和/或 BOOST_ABI_SUFFIX 来指向它们自己的前缀/后缀头文件,如果他们想要的话。

当用户链接到一个库的某个构建时,本质上该库构建时所链接的运行期库必须与他们的应用所链接的一样 - 如果不是这样的话,该库与他们的代码就不是二进制兼容的 - 很可能他们的应用会在运行时发生异常。这种问题的调测非常耗费时间,也很困难,常常会导致用户和作者同样的失败(选择正确的库来链接并不像看起来那么容 易,它们通常有6-8个选择,有些用户并不清楚它们会有不同的选择)。

为了解决这个问题,有些编译器允许源代码包含 #pragma 以指示链接器要链接哪一个库,用户要做的只是包含他们所需的头文件,将已编译的库放在他的库搜索路径中,剩下的交给编译器和链接器去做就行了。 Boost.config 通过头文件 <boost/config/auto_link.hpp> 支持这一方法,在包含这一头文件之前,要定义以下一个或多个宏:

BOOST_LIB_NAME

必选:包含库的基本名的一个标识符,例如 'boost_regex'.

BOOST_DYN_LINK

可选:要设置链接 dll 而不是静态库时。

BOOST_LIB_DIAGNOSTIC

可选:要设置头文件打印出选定的库的名字时(用于调试)。

如果编译器支持这种机制,那么它将被告知链接到适当名字的库,用于生成库名的实际算法在 <boost/config/auto_link.hpp> 中有相关说明,它必须与通过 bjam 的安装规则进行库的创建所用的算法相匹配。

my_library.hpp

...
//
// 如果用户已通过定义 BOOST_ALL_NO_LIB 或 BOOST_MY_LIBRARY_NO_LIB 来禁止,
// 或者这是我们自己的源代码(以 BOOST_MY_LIBRARY_SOURCE 来表示),则不包含自动
// 自动链接代码:
//
#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_MY_LIBRARY_NO_LIB) && !defined(BOOST_MY_LIBRARY_SOURCE)
# define BOOST_LIB_NAME boost_my_library
# ifdef BOOST_MY_LIBRARY_DYN_LINK
# define BOOST_DYN_LINK
# endif
# include <boost/config/auto_link.hpp>
#endif
...

my_library.cpp

// 定义 BOOST_MY_LIBRARY_SOURCE 以便头文件得知该库正在构建
// (可能是导出而不是导入代码)
//
#define BOOST_MY_LIBRARY_SOURCE
#include <boost/my_library/my_library.hpp>
...
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章