assert () avec message

J'ai vu quelque part affirmer utilisé avec un message de la manière suivante:

assert(("message", condition));

Cela semble fonctionner très bien, sauf que gcc lance l'avertissement suivant:

warning: left-hand operand of comma expression has no effect

Comment puis-je arrêter l'avertissement?

32
demandé sur Alexandru 2011-05-03 13:54:06

4 réponses

Utiliser -Wno-unused-value pour arrêter l'avertissement; (l'option -Wall inclut -Wunused-value).

Je pense que encore mieux est d'utiliser une autre méthode, comme

assert(condition && "message");
58
répondu pmg 2011-05-03 10:29:59

Essayez:

#define assert__(x) for ( ; !(x) ; assert(x) )

Utiliser comme tel:

assert__(x) {
    printf("assertion will fail\n"); 
}

Exécutera le bloc uniquement lorsque assert échoue.

NOTE IMPORTANTE: cette méthode évaluera l'expression x deux fois, dans le cas où x évalue à false! (première fois, lorsque la boucle for vérifie sa condition; deuxième fois, lorsque le assert évalue l'expression passée!)

18
répondu bugfeeder 2016-01-03 21:35:25

Si vous souhaitez transmettre un message formaté, vous pouvez utiliser les macros suivantes:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <assert.h>

#define clean_errno() (errno == 0 ? "None" : strerror(errno))
#define log_error(M, ...) fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
#define assertf(A, M, ...) if(!(A)) {log_error(M, ##__VA_ARGS__); assert(A); }

Ensuite, utilisez-le comme printf:

// With no args
assertf(self != NULL,"[Server] Failed to create server.");

// With formatting args
assertf((self->socket = u_open(self->port)) != -1,"[Server] Failed to bind to port %i:",self->port);
// etc...

Sortie:

[Erreur] (../ src / serveur web.C: 180: errno: adresse déjà utilisée) [Serveur] impossible de lier au port 8080: serveur web: ../ src / serveur web.c:180: server_run: Assertion `(auto->socket = u_open (self->port)) != -1' a échoué.

Basée sur http://c.learncodethehardway.org/book/ex20.html

10
répondu frmdstryr 2014-03-29 15:48:47

Selon le lien suivant http://www.cplusplus.com/reference/clibrary/cassert/assert/

Assert n'attend que l'expression. Peut-être que vous utilisez une fonction surchargée.

Selon ceci, seule l'expression est autorisée et donc vous obtenez cet avertissement.

-7
répondu Dhiraj 2011-05-03 10:13:16