编译时断言在没有GCC优化的情况下失败

时间:2015-06-29 16:42:56

标签: c gcc linux-kernel macros gcc-warning

我有以下编译时断言,如果我在没有-O [1-3]标志的情况下编译,则会失败。

#ifndef __compiletime_error
#define __compiletime_error(message)
#endif
#ifndef __compiletime_error_fallback
#define __compiletime_error_fallback(condition) do { } while (0)
#endif

#define __compiletime_assert(condition, msg, prefix, suffix)        \
    do {                                \
        int __cond = !(condition);              \
        extern void prefix ## suffix(void) __compiletime_error(msg); \
        if (__cond)                     \
            prefix ## suffix();             \
        __compiletime_error_fallback(__cond);           \
    } while (0)

#define _compiletime_assert(condition, msg, prefix, suffix) \
    __compiletime_assert(condition, msg, prefix, suffix)

#define compiletime_assert(condition, msg) \
    _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)

#endif

这将与位于另一个(gcc-4特定)文件中的以下宏结合使用:

#define __compiletime_error(message)    __attribute__((error(message)))

问题来自代码中的这一行:

        extern void prefix ## suffix(void) __compiletime_error(msg); \

如果没有extern标志,GCC似乎无法理解宏中的-O[1-3]。我不确定在实际调用此宏之前我应该​​如何声明__compiletime_error。如果我删除此行,我会收到Implicit declaration of a function

的着名警告

1 个答案:

答案 0 :(得分:3)

您的compiletime_assert框架依赖于优化器执行死代码删除来删除对prefix ## suffix的调用。这是非常脆弱的,绝不保证工作。

相反,尝试使用Ways to ASSERT expressions at build time in C中的一个解决方案 - 或者,因为您使用的是现代编译器,所以只需使用C11 _Static_assert