configuração
A biblioteca de configuração é fornecida principalmente para desenvolvedores da biblioteca Boost (e não para usuários da biblioteca). Ela decompõe a configuração de compilação do programa em três partes ortogonais: plataforma, compilador e biblioteca padrão, ajudando-os a resolver os problemas de compiladores específicos de plataforma específica. Compatibilidade problemas.
De modo geral, a biblioteca de configuração não deve ser usada pelos usuários da biblioteca, mas nesta biblioteca também podemos encontrar vários gadgets úteis (na verdade, no Capítulo 1, já usamos macros como BOOST_PLATFORM na biblioteca de configuração).
BOOST_STRINGIZE
A macro BOOST_STRINGIZE pode converter qualquer literal em uma string. Para utilizar a macro BOOST_STRINGIZE é necessário incluir o arquivo de cabeçalho <boost/config/suffix.hpp>, ou seja:
#include<boost/config/suffix.hpp>
BOOST_STRINGIZE é uma macro, o que é importante porque significa que ela só pode ser usada em tempo de compilação (pré-processamento antes da compilação, para ser mais preciso) e não suporta conversão em tempo de execução. Se você deseja converter um número ou outra variável em uma string em tempo de execução, use lexical_cast.
O código que demonstra o uso de BOOST_STRINGIZE é o seguinte: __LINE__ é uma macro integrada definida no padrão C, que representa o número da linha do programa e é um número inteiro longo:
cout << BOOST_STRINGIZE(__LINE__) << endl;
cout << std::boolalpha << (string("22") == BOOST_STRINGIZE(__LINE__)) << endl;
int x = 255;
cout << BOOST_STRINGIZE(x) << endl;
As duas primeiras instruções do código usam BOOST_STRINGIZE para converter o inteiro em tempo de compilação em uma string. A terceira BOOST_STRINGIZE não pode manipular a variável inteira em tempo de execução e só pode convertê-la em uma string literal.
O uso mais comum de BOOST_STRINGIZE é converter constantes de tempo de compilação em strings em programação genérica, o que é muito conveniente ao depurar ou gerar logs.Por exemplo, BOOST_STRINGIZE é usado em boost.exception.
BOOST_STATIC_CONSTANT
O padrão C++ permite atribuir valores iniciais a variáveis de membros inteiros estáticos diretamente na declaração da classe, mas nem todos os compiladores implementam esse recurso. Se o compilador usado não tiver esse recurso, enum só poderá ser usado para contornar a implementação.
O código a seguir define uma classe static_int que usa ambos os métodos:
struct static_int
{
static const int v1 = 10; //静态整型变量赋初值
enum {
v2 = 20 }; //枚举得到编译期整数值
int a[v2];
};
A macro BOOST_STATIC_CONSTANT fornece uma sintaxe portátil e conveniente para resolver este problema:
BOOST_STATIC_CONSTANT(type, assignment)
Usando a macro BOOST_STATIC_CONSTANT, não precisamos nos preocupar com as limitações de capacidade do compilador e o código será mais portátil. É usado como uma instrução de atribuição de variável comum, mas usa uma forma de macro ligeiramente modificada.
O exemplo anterior pode ser reescrito usando a macro BOOST_STATIC_CONSTANT da seguinte maneira:
struct static_int
{
BOOST_STATIC_CONSTANT(int, v1 = 10);
BOOST_STATIC_CONSTANT(int, v2 = 20);
};
Esse código é mais claro e legível do que simples declarações ou enums de variáveis de membros estáticos.
exemplo de código
#include <iostream>
using namespace std;
#include <boost/core/ignore_unused.hpp>
#include <boost/version.hpp>
#if BOOST_VERSION <= 106400
#include <boost/config/suffix.hpp>
#else
#include <boost/config/detail/suffix.hpp>
#endif
using namespace boost;
//
void case1()
{
cout << BOOST_STRINGIZE(__LINE__) << endl;
cout << std::boolalpha << (string("22") == BOOST_STRINGIZE(__LINE__)) << endl;
int x = 255;
cout << BOOST_STRINGIZE(x) << endl;
ignore_unused(x);
}
//
struct static_int
{
BOOST_STATIC_CONSTANT(int, v1 = 10);
BOOST_STATIC_CONSTANT(int, v2 = 20);
};
//
int main()
{
case1();
}