assert () с сообщением - PullRequest
35 голосов
/ 03 мая 2011

Я видел, как где-то assert используется с сообщением следующим образом:

assert(("message", condition));

Это, кажется, работает отлично, за исключением того, что gcc выдает следующее предупреждение:

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

Как я могу остановить предупреждение?

Ответы [ 4 ]

64 голосов
/ 03 мая 2011

Используйте -Wno-unused-value, чтобы остановить предупреждение; (опция -Wall включает -Wunused-value).

Я думаю, что еще лучше использовать другой метод, например

assert(condition && "message");
20 голосов
/ 09 июня 2012

Попробуйте:

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

используйте как таковое:

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

Выполнит блок только при сбое подтверждения.

ВАЖНОЕ ПРИМЕЧАНИЕ: Этот метод оценивает выражение x дважды, в случае, если x оценивается как false! (Первый раз, когда цикл for проверяет свое состояние; второй раз, когда assert оценивает переданное выражение!)

11 голосов
/ 29 марта 2014

Если вы хотите передать отформатированное сообщение, вы можете использовать следующие макросы:

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

Затем использовать его как 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...

Вывод:

[ОШИБКА] (../src/webserver.c:180: errno: адрес уже используется) [Сервер] Не удалось подключиться к порту 8080: веб-сервер: ../src/webserver.c:180: server_run: Сбой утверждения `(self-> socket = u_open (self-> port))! = -1 '.

На основе http://c.learncodethehardway.org/book/ex20.html

0 голосов
/ 03 мая 2011

по следующей ссылке http://www.cplusplus.com/reference/clibrary/cassert/assert/

assert ожидает только выражения. Может быть, вы используете какую-то перегруженную функцию.

В соответствии с этим разрешено только выражение, и таким образом вы получаете это предупреждение.

...