私のコードでは、このようなコンパイラ アサートを広範囲に使用して、実行時よりもビルド時にエラーにフラグを立て、実行時にアサートを実行しないことでパフォーマンスを向上させています。
#define COMPILER_ASSERT(EXPR) switch (0) {case 0: case (EXPR):;}
すべて良い。これを拡張して、次の場合にコンパイラのアサートを使用したいと思います。100 か所から呼び出されるマクロがあり、そのうち 99 か所が固定値を渡し、そのうちの 1 か所が変数を渡すとします。これを 99 か所でコンパイラ アサートにし、最後の 1 か所でランタイム アサートにするマクロをコーディングするにはどうすればよいでしょうか。
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