Au moment de la compilation affirmation?
Est-il une manière que je peux affirmer que les deux expressions constantes sont égales au moment de la compilation?
par exemple, je veux que cela provoque une erreur de compilation
enum { foo=263, bar=264 };
SOME_EXPRESSION(foo,bar)
mais je souhaite que cela pour ne pas causer une erreur
enum { foo=263, bar=263 };
SOME_EXPRESSION(foo,bar)
edit: le ci-dessus a été simplifié. Ma situation est plus comme
some_other_file_I_dont_control.h:
class X
{
public:
enum { foo=263 };
}
my_file.h:
enum { bar=something+somethingelse }; //bar should equal X::foo
SOME_EXPRESSION(X::foo, bar)
Vous devez vous connecter pour publier un commentaire.
Voir
static_assert
(C++0x uniquement); sur une version plus ancienne, voir Du coup de pouceStaticAssert
.static_assert
peut ne pas fonctionner si les comparaisons entre le contenu des variables.Oui. Vous pouvez le faire avec les spécialisations de modèle sur le type bool, comme ceci:
Code est essentiellement à partir de la mémoire, peuvent avoir besoin de quelques ajustements.
assert()
membre et il suffit d'utiliser le constructeur par défaut:StaticAssert<1==1>();
bool
pourquoi ne pouvez pas vous passer de tout bool créé par programme au moment de l'exécution? Je suis en train d'essayer ce nouveau code de la vôtre et en le passant dans un bool-je mettre à jour au moment de l'exécution, mais le compilateur ne parvient pas direnon-type template argument is not a constant expression
constexpr
)Pour une autre version de la statique affirmer, que vous pouvez glorifier par l'ajout d'un nom de mieux, vous pouvez utiliser:
Et l'utiliser comme:
Le compilateur va déclencher une erreur semblable à la suivante:
Qui ne semble pas très utile, mais il ne sera point à la ligne exacte de l'affirmer, et après un moment vous allez commencer le traitement de ce message d'erreur comme statique assert failed
Une autre possibilité pour Windows est C_ASSERT, qui est définie si Windows.h est inclus.
Il y a aussi le truc pour utiliser un
switch (..)
déclaration. Type de style ancien bien. Le cas de l'entrée foo == barre à la compilation évalués, et si elle arrive à être faux l'instruction switch va provoquer une erreur. Le compilateur va également réduire à "rien".vous pouvez définir vos propres statique de l'assertion , de cette façon :
Similaire à iammillind de la solution, qui a malheureusement été l'un seulement utile à l'exécution:
La bonne chose à ce sujet est qu'il fournit un bon compilateur message. Mon compilateur dit
moi qui suit:
Vous n'avez pas besoin de la définition de type. Sans:
Bien sûr, il y a un tas d'autres façons de générer des messages utiles. Pour le fou rire:
J'ai le compilateur erreurs:
combinaisons de fonctions membres statiques/constructeurs/cession de terrain/de confidentialité et de modèle spécifications peuvent donner des résultats différents peut-être plus approprié pour votre situation.
Cette dérive de la
checked_delete
idiome.checked_delete
avec une fonction spécifique. Cependant, l'idée reste la même. Et... vous pouvez facilement changer l'expression de testa == b
à quelque chose d'autre, par exemple pour tester si trois des enums sont tous égaux (a == b && b == c
) ou pour tester si les énumérations sont dans une gamme ((a - b) < N
) etc.Vous pouvez faire un peu de préprocesseur la magie comme
#if
,#error
, et#endif
. Cela vous donne exactement ce que vous avez demandé, qui est un moment de la compilation, test de savoir si ou de ne pasX::foo
etbar
sont égaux l'un à l'autre. La belle le sur#error
est que vous contrôle le message d'erreur. La bonne chose est que certains C préprocesseurs sont pas compatibles ANSI, notamment avec les préprocesseurs pour les anciens, les systèmes embarqués.Je pencherais pour un de static_asserts.
Mais juste parce que je n'ai jamais essayé avant, j'ai écrit ceci:
#error
est disponible, il est beaucoup plus compact et le message d'erreur peut être faite pour être très évident.boost::static_assert
est un peu gonflé et les messages d'erreur sont gonflés++.Je suggère de prendre un regard sur les modes Propres de la bibliothèque statique affirmer mécanisme:
http://eigen.tuxfamily.org/dox/StaticAssert_8h_source.html
J'ai pris l'exemple de
int
. Vous pouvez modifier en fonction de votre besoin. Voici la démo.Utilisation:
boost::static_assert
.