Guide de développement Boost-4.11config

configuration

La bibliothèque de configuration est principalement fournie aux développeurs de la bibliothèque Boost (plutôt qu'aux utilisateurs de la bibliothèque). Elle décompose la configuration de compilation du programme en trois parties orthogonales : plate-forme, compilateur et bibliothèque standard, les aidant à résoudre les problèmes des compilateurs spécifiques à la plate-forme. problèmes.

D'une manière générale, la bibliothèque de configuration ne doit pas être utilisée par les utilisateurs de la bibliothèque, mais dans cette bibliothèque, nous pouvons également trouver plusieurs gadgets utiles (en fait, au chapitre 1, nous avons déjà utilisé des macros telles que BOOST_PLATFORM dans la bibliothèque de configuration).

BOOST_STRINGIZE

La macro BOOST_STRINGIZE peut convertir n'importe quel littéral en chaîne. Afin d'utiliser la macro BOOST_STRINGIZE, le fichier d'en-tête <boost/config/suffix.hpp> doit être inclus, c'est-à-dire :

#include<boost/config/suffix.hpp>

BOOST_STRINGIZE est une macro, ce qui est important car cela signifie qu'elle ne peut être utilisée qu'au moment de la compilation (prétraitement avant la compilation pour être précis) et ne prend pas en charge la conversion à l'exécution. Si vous souhaitez convertir un nombre ou une autre variable en chaîne au moment de l'exécution, utilisez lexical_cast.

Le code qui démontre l'utilisation de BOOST_STRINGIZE est le suivant. __LINE__ est une macro intégrée définie dans la norme C, qui représente le numéro de ligne du programme et est un entier long :

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

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

Les deux premières instructions du code utilisent BOOST_STRINGIZE pour convertir l'entier de compilation en chaîne. La troisième BOOST_STRINGIZE ne peut pas gérer la variable entière d'exécution et ne peut la convertir qu'en chaîne littérale.

L'utilisation la plus courante de BOOST_STRINGIZE consiste à convertir des constantes de compilation en chaînes dans la programmation générique, ce qui est très pratique lors du débogage ou de la sortie de journaux. Par exemple, BOOST_STRINGIZE est utilisé dans boost.exception.

BOOST_STATIC_CONSTANT

La norme C++ permet d'attribuer des valeurs initiales aux variables membres entières statiques directement dans la déclaration de classe, mais tous les compilateurs n'implémentent pas cette fonctionnalité. Si le compilateur utilisé ne dispose pas de cette fonctionnalité, enum ne peut être utilisé que pour contourner l'implémentation.

Le code suivant définit une classe static_int qui utilise les deux méthodes :

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

La macro BOOST_STATIC_CONSTANT fournit une syntaxe portable et pratique pour résoudre ce problème :

BOOST_STATIC_CONSTANT(type, assignment)

En utilisant la macro BOOST_STATIC_CONSTANT, nous n'avons pas à nous soucier des limitations des capacités du compilateur et le code sera plus portable. Il est utilisé comme une instruction d'affectation de variable ordinaire, mais utilise une forme de macro légèrement modifiée.

L'exemple précédent peut être réécrit à l'aide de la macro BOOST_STATIC_CONSTANT comme suit :

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

Un tel code est plus clair et plus lisible que de simples déclarations ou énumérations de variables membres statiques.

exemple de code

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

Insérer la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_36314864/article/details/132556992
conseillé
Classement