L’avantage réel des alias d’espace de noms vs define

EDIT: Je prévois de refactoriser du code et de remplacer le define par un alias d’espace de nommage. Je ne peux pas le faire simplement parce que “les macros sont diaboliques”. Je dois expliquer pourquoi je veux faire le changement et ce qui peut mal tourner si je ne le fais pas.

En laissant de côté la position selon laquelle “les macros sont diaboliques”, quels sont les inconvénients de #define rapport à un alias d’espace de nom?

Prendre le code

 #define MY_NAMESPACE my_namespace 

contre

 namespace MY_NAMESPACE = my_namespace; 

La raison pour avoir des alias n’est pas dans la scope de la question. Vous pouvez également supposer que le nom de l’espace de nom est suffisamment unique pour ne pas apparaître ailleurs (c’est-à-dire qu’il fait simplement référence à cet espace de nom, il ne peut pas, ni maintenant, ni dans le futur, faire référence à une variable, une classe ou que ce soit), donc il ne peut y avoir aucune ambiguïté là.

Dans ce cas particulier, cela dépend. Si l’utilisation d’un alias d’espace de noms suffit, préférez-le plutôt aux macros, pour toutes les raisons habituelles. Mais les deux font des choses radicalement différentes. Vous ne pouvez pas ouvrir un espace de noms en utilisant son alias, c’est-à-dire:

 namespace XYZ_ver1 {} namespace XYZ = XYZ_ver1; namespace XYZ { // Illegal! } 

Cela fonctionne avec une macro. En fait, vous pouvez définir la macro avant que l’espace de nom n’apparaisse. Si vous en avez besoin, vous devez utiliser une macro.

De manière générale, le seul avantage que je vois avec les alias d’espaces de noms est qu’ils peuvent être n’importe où. Prenons l’exemple suivant:

 namespace a { namespace that_is_a_great_namespace { namespace b = that_is_a_great_namespace; } } namespace that_is_a_great_namespace {} 

Vous ne pourrez pas définir une macro qui convertira a::that_is_a_great_namespace en a::b sans effet secondaire. Ici, that_is_a_great_namespace sera également converti en b . Les alias d’espaces de noms aident à résoudre les conflits de noms dans ces cas.

Cependant, si vous utilisez déjà #defines et que cela fonctionne déjà, il peut ne pas être utile de refactoriser votre code pour un cas aussi rare.