Guía de desarrollo de Boost-4.11config

configuración

La biblioteca de configuración se proporciona principalmente a los desarrolladores de la biblioteca Boost (en lugar de a los usuarios de la biblioteca) y descompone la configuración de compilación del programa en tres partes ortogonales: plataforma, compilador y biblioteca estándar, ayudándoles a resolver los problemas de compiladores específicos de plataformas específicas. problemas.

En términos generales, los usuarios de la biblioteca no deberían usar la biblioteca de configuración, pero en esta biblioteca también podemos encontrar varios gadgets útiles (de hecho, en el Capítulo 1, ya hemos usado macros como BOOST_PLATFORM en la biblioteca de configuración).

BOOST_STRINGIZE

La macro BOOST_STRINGIZE puede convertir cualquier literal en una cadena. Para utilizar la macro BOOST_STRINGIZE, se debe incluir el archivo de encabezado <boost/config/suffix.hpp>, es decir:

#include<boost/config/suffix.hpp>

BOOST_STRINGIZE es una macro, lo cual es importante porque significa que solo se puede usar en tiempo de compilación (preprocesamiento antes de la compilación para ser precisos) y no admite conversión en tiempo de ejecución. Si desea convertir un número u otra variable en una cadena en tiempo de ejecución, use lexical_cast.

El código que demuestra el uso de BOOST_STRINGIZE es el siguiente: __LINE__ es una macro incorporada definida en el estándar C, que representa el número de línea del programa y es un entero largo:

cout << BOOST_STRINGIZE(__LINE__) << endl;
cout << std::boolalpha << (string("22") == BOOST_STRINGIZE(__LINE__)) << endl;

int x = 255;
cout << BOOST_STRINGIZE(x) << endl;

Las dos primeras declaraciones del código usan BOOST_STRINGIZE para convertir el entero en tiempo de compilación en una cadena. La tercera BOOST_STRINGIZE no puede manejar la variable entera en tiempo de ejecución y solo puede convertirla en una cadena literal.

El uso más común de BOOST_STRINGIZE es convertir constantes de tiempo de compilación en cadenas en programación genérica, lo cual es muy conveniente al depurar o generar registros. Por ejemplo, BOOST_STRINGIZE se usa en boost.exception.

BOOST_STATIC_CONSTANT

El estándar C++ permite asignar valores iniciales a variables miembro enteras estáticas directamente en la declaración de clase, pero no todos los compiladores implementan esta característica. Si el compilador utilizado carece de esta capacidad, enum solo se puede utilizar para solucionar la implementación.

El siguiente código define una clase static_int que utiliza ambos métodos:

struct static_int
{
    
    
     static const int v1 = 10; //静态整型变量赋初值
     enum {
    
     v2 = 20 }; //枚举得到编译期整数值
     int a[v2];
};

La macro BOOST_STATIC_CONSTANT proporciona una sintaxis portátil y conveniente para resolver este problema:

BOOST_STATIC_CONSTANT(type, assignment)

Al usar la macro BOOST_STATIC_CONSTANT, no tenemos que preocuparnos por las limitaciones de capacidad del compilador y el código será más portátil. Se utiliza como una declaración de asignación de variables ordinaria, pero utiliza una forma de macro ligeramente modificada.

El ejemplo anterior se puede reescribir usando la macro BOOST_STATIC_CONSTANT de la siguiente manera:

struct static_int
{
    
    
     BOOST_STATIC_CONSTANT(int, v1 = 10);
     BOOST_STATIC_CONSTANT(int, v2 = 20);
};

Dicho código es más claro y legible que las simples declaraciones o enumeraciones de variables miembro estáticas.

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

Insertar descripción de la imagen aquí

Supongo que te gusta

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