没有 GCC 优化的编译时断言失败
Compile-time assertion fails without GCC optimization
我有以下编译时断言,如果我在没有 -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); \
GCC 似乎不理解宏中没有 -O[1-3]
标志的 extern
。我不确定在 __compiletime_error 实际在此宏中被调用之前我应该如何声明它。如果我删除这一行,我会收到 Implicit declaration of a function
的著名警告
您的 compiletime_assert
框架依赖优化器执行无用代码消除来移除对 prefix ## suffix
的调用。这是非常脆弱的,不能保证有效。
改为尝试使用 Ways to ASSERT expressions at build time in C - or, since you're using a modern compiler, just use C11 _Static_assert
中的一种解决方案。
我有以下编译时断言,如果我在没有 -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); \
GCC 似乎不理解宏中没有 -O[1-3]
标志的 extern
。我不确定在 __compiletime_error 实际在此宏中被调用之前我应该如何声明它。如果我删除这一行,我会收到 Implicit declaration of a function
您的 compiletime_assert
框架依赖优化器执行无用代码消除来移除对 prefix ## suffix
的调用。这是非常脆弱的,不能保证有效。
改为尝试使用 Ways to ASSERT expressions at build time in C - or, since you're using a modern compiler, just use C11 _Static_assert
中的一种解决方案。