Guia de Desenvolvimento Boost-4.11config

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();
}

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/qq_36314864/article/details/132556992
Recomendado
Clasificación