コンパイル時に初期化される非常に大きな定数配列があります。
typedef enum {
VALUE_A, VALUE_B,...,VALUE_GGF
} VALUES;
const int arr[VALUE_GGF+1] = { VALUE_A, VALUE_B, ... ,VALUE_GGF};
配列が正しく初期化されていることを確認したいのですが、次のようになります。
if (arr[VALUE_GGF] != VALUE_GGF) {
printf("Error occurred. arr[VALUE_GGF]=%d\n", arr[VALUE_GGF]);
exit(1);
}
私の問題は、コンパイル時にこれを確認したいということです。このスレッドのCでのコンパイル時のアサートについて読みました:Cコンパイラがアサートします。ただし、そこで提供されるソリューションは、コンパイルエラーのサイズとして負の値を使用して配列を定義することを提案しています。
#define CASSERT(predicate, file) _impl_CASSERT_LINE(predicate,__LINE__,file)
#define _impl_PASTE(a,b) a##b
#define _impl_CASSERT_LINE(predicate, line, file) \
typedef char _impl_PASTE(assertion_failed_##file##_,line)[2*!!(predicate)-1];
と使用:
CASSERT(sizeof(struct foo) == 76, demo_c);
定数配列の値を確認する必要があり、Cでは定数配列の値を使用して配列を初期化できないため、提供されたソリューションは機能しません。
int main() {
const int i = 8;
int b[i]; //OK in C++
int b[arr[0]]; //C2057 Error in VS2005
それを回避する方法はありますか?他のコンパイル時のアサート?