2012-09-24 2 views
9

Je ne trouve pas d'indication claire sur la sémantique de Q_ASSERT dans les versions de versions. S'il n'y a pas de vérification d'assertion, alors l'expression affirmée est-elle évaluée?Q_ASSERT release construction sémantique

Consultez le code suivant

Q_ASSERT(do_something_report_false_if_failed()); 

Will do_something_report_false_if_failed() run sous toutes les Qt potentiels des configurations de construction? Serait-il plus sûr (même si un peu plus bavard et moins lisible) pour ce faire à la place:

bool is_ok = do_something_report_false_if_failed(); 
Q_ASSERT(is_ok) 

Cette dernière approche a l'inconvénient que AFFIRMER échecs sont moins bavard, mais peut-être montre plus clairement que la déclaration est réalisé?

Répondre

15

L'expression à l'intérieur du Q_ASSERT sera et non être évaluée dans des configurations de construction non-debug.

Considérons le code source ci-dessous à partir du Qt repo.

#if !defined(Q_ASSERT) 
# ifndef QT_NO_DEBUG 
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) 
# else 
# define Q_ASSERT(cond) qt_noop()  
# endif  
#endif 

Si QT_NO_DEBUG est définie, l'intégralité de l'instruction Q_ASSERT est remplacé par un qt_noop(), éliminant ainsi toute expression qu'il contenait précédemment.

Ne comptez jamais sur les effets secondaires créés par une expression dans une instruction Q_ASSERT. Techniquement, il est toujours possible de s'assurer que QT_NO_DEBUG n'est pas défini dans une configuration de construction spécifique, mais ce n'est pas une bonne idée.

+0

C'est exactement la même situation que pour les normales 'assert' et' NDEBUG'. –

14

Cela semble être différent Qt5.5 (mais pas avant - voir Qt5.4):

#if !defined(Q_ASSERT) 
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) 
# define Q_ASSERT(cond) do { } while ((false) && (cond)) 
# else 
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) 
# endif 
#endif 

Je suis maintenant obtenir beaucoup de "avertissement C4127: expression conditionnelle est constante" dans Visual Studio 2013.

Mise à jour: Qt5.5 release notes dire:

Q_ASSERT élargira maintenant la condition même en mode de libération lorsque Les assertions sont désactivées, bien que dans un chemin de code inaccessible. Cette résout les avertissements du compilateur sur les variables et les fonctions qui étaient inutilisées en mode de libération car elles étaient uniquement utilisées dans les assertions. Malheureusement, les bases de code qui ont caché ces fonctions et variables via #ifndef devront supprimer les conditions à compiler avec Qt 5.5.

+0

Redéfinir Q_ASSERT et Q_ASSERT_X retour à noop aide – user2846246

+2

Ceci est le changement de gerrit: https://codereview.qt-project.org/#/c/94460/3 – Uflex

+0

J'ai le même problème. Est-ce corrigé dans les versions Qt> 5.5? – Knitschi

Questions connexes