Я знаю, что вопрос явно упоминает gcc, но только для полноты здесь есть настройка для компиляторов Microsoft.
Использование массива с отрицательным размером typedef не убеждает cl , чтобы выплюнуть приличную ошибку. Он просто говорит error C2118: negative subscript
. В этом отношении лучше всего подходит битовая область с нулевой шириной. Поскольку это подразумевает типизацию структуры, нам действительно нужно использовать уникальные имена типов. __LINE__
не разрезает горчицу; возможно иметь COMPILE_TIME_ASSERT()
в той же строке в заголовке и исходном файле, и ваш компилятор сломается. __COUNTER__
приходит на помощь (и он был в gcc с 4.3).
#define CTASTR2(pre,post) pre ## post
#define CTASTR(pre,post) CTASTR2(pre,post)
#define STATIC_ASSERT(cond,msg) \
typedef struct { int CTASTR(static_assertion_failed_,msg) : !!(cond); } \
CTASTR(static_assertion_failed_,__COUNTER__)
Теперь
STATIC_ASSERT(sizeof(long)==7, use_another_compiler_luke)
в cl
дает:
error C2149: 'static_assertion_failed_use_another_compiler_luke': имя битового поля не может иметь нулевую ширину
blockquote>Gcc также дает понятное сообщение:
error: zero width для бит-поля 'static_assertion_failed_use_another_compiler_luke'
blockquote>
Я думаю, что у некоторых были проблемы с идентификаторами, имеющими пробелы / и т. Д. Между ними или что-то в этом роде.
Я нашел обходной путь для решения проблемы.
Только что использовали:
var name = "a" + target;
var nameVal = document.getElementById(name).value;
и т. Д.