assert() with message

前端 未结 7 680
醉梦人生
醉梦人生 2020-12-24 01:08

I saw somewhere assert used with a message in the following way:

assert((\"message\", condition));

This seems to work great, except that gc

相关标签:
7条回答
  • 2020-12-24 01:33

    Use -Wno-unused-value to stop the warning; (the option -Wall includes -Wunused-value).

    I think even better is to use another method, like

    assert(condition && "message");
    
    0 讨论(0)
  • 2020-12-24 01:33

    You could write your own macro that provides the same usage of _Static_assert(expr, msg):

    #include <assert.h>
    #include <stdbool.h>
    #include <stdio.h>
    
    
    /*
     * void assert_msg(bool expr, const char *msg);
     */
    #if !defined(NDEBUG)
    #define assert_msg(expr, msg)   do                  \
    {                                                   \
            const bool  e_ = expr;                      \
                                                        \
            if (!e_) {                                  \
                    fputs(msg, stderr);                 \
                    fputc('\n', stderr);                \
                    assert(e_);                         \
            }                                           \
    } while (0)
    #else
    #define assert_msg(expr, msg)   do                  \
    {                                                   \
                                                        \
            if (!(expr))                                \
                    warn_bug(msg);                      \
    } while (0)
    #endif
    

    I also have a macro warn_bug() that prints the name of the program, the file, the line, the function, the errno value and string, and a user message, even if asserts are disabled. The reason behind it is that it won't break the program, but it will warn that a bug will probably be present. You could just define assert_msg to be empty if defined(NDEBUG), though.

    0 讨论(0)
  • 2020-12-24 01:41

    According to following link http://www.cplusplus.com/reference/clibrary/cassert/assert/

    assert is expecting only expression. May be you are using some overloaded function.

    According to this, only expression is allowed and thus you are getting this warning.

    0 讨论(0)
  • 2020-12-24 01:42

    A function that takes const char* and returns true would probably save you from all sorts of warnings:

    #include <assert.h>
    
    int always_true(const char *msg) {
        return 1;
    }
    
    #define assert_msg(expr, msg) assert((expr) && always_true(msg))
    
    0 讨论(0)
  • 2020-12-24 01:46

    Try:

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

    use as such:

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

    Will execute the block only when assert fails.

    IMPORTANT NOTE: This method will evaluate expression x twice, in case x evaluates to false! (First time, when the for loop is checking its condition; second time, when the assert is evaluating the passed expression!)

    0 讨论(0)
  • 2020-12-24 01:53

    If you want to pass a formatted message, you could use the following macros:

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

    Then use it like 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...
    

    Output:

    [ERROR] (../src/webserver.c:180: errno: Address already in use) [Server] Failed to bind to port 8080: webserver: ../src/webserver.c:180: server_run: Assertion `(self->socket = u_open(self->port)) != -1' failed.

    Based on http://c.learncodethehardway.org/book/ex20.html

    0 讨论(0)
提交回复
热议问题