我的代码广泛使用这样的编译器断言来在构建时标记错误而不是运行时,并通过在运行时不执行断言来提高性能。
#define COMPILER_ASSERT(EXPR) switch (0) {case 0: case (EXPR):;}
都好。我想扩展它以在以下情况下使用编译器断言。假设我有一个从 100 个位置调用的宏,其中 99 个传递一个固定值,其中 1 个传递一个变量。我如何编码宏以使其成为 99 个位置的编译器断言和最后一个位置的运行时断言。
如果我能保证 MY_FUNCTION() 总是以固定值调用,我可以这样编码。
void my_function(int x)
{
//do something
}
#define MY_FUNCTION(X) \
COMPILER_ASSERT(X != 0); \
my_function(X)
//These can all take advantage of a compiler assert.
MY_FUNCTION(1);
MY_FUNCTION(SOME_HASH_DEFINE);
MY_FUNCTION(sizeof(SOME_STRUCTURE));
//This can't (this is a contrived example - actual code is complex).
int some_variable = 1;
MY_FUNCTION(some_variable);
所以,如果我不能保证 X 是固定的,但想利用每次调用 MY_FUNCTION() 的优势,我该如何编码呢?就像是:
#define MY_FUNCTION(X) \
if (X is a fixed value) COMPILER_ASSERT(X != 0); \
else assert(X != 0); \
my_function(X)
重新编码对 MY_FUNCTION() 的调用以仅传递固定值对我来说不是一个选择。是的,我可以定义 MY_FUNCTION_FIXED_X 和 MY_FUNCTION_VARIABLE_X 但这会将所有这些都暴露给调用代码。
谢谢你的帮助。尼克B