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>
...
 

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