Если вы хотите передать отформатированное сообщение, вы можете использовать следующие макросы:
#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