после этого вопроса Почему gcc не разрешает const int как выражение case?, в основном то же, что и Какие продвинутые типы используются для сравнения выражений switch-case? или Есть ли способ использовать постоянный массив с постоянным индексом в качестве метки case-переключателя в C?.
По первой ссылке я попытался заменить:
case FOO: // aka 'const int FOO = 10'
с участием :
case ((int) "toto"[0]): // can't be anything *but* constant
Который дает :
https://ideone.com/n1bmIb -> https://ideone.com/4aOSXR = работает на C ++
https://ideone.com/n1bmIb -> https://ideone.com/RrnO2R = не работает на C
Я не совсем понимаю, поскольку строка «toto» не может быть чем-либо кроме константой, это даже не переменная, она лежит в пустоте памяти компилятора. Я даже не играю с нечеткой логикой 'const' языка C (которая на самом деле означает «только для чтения, а не константа, чего вы ожидали?»), Проблема либо в «доступе к массиву», либо в «ссылках на указатели» "в постоянное выражение, которое не вычисляется в C, но неплохо работает в C ++.
Я ожидал использовать этот «трюк», чтобы использовать HASH_MACRO (str) для генерации уникальных значений меток case из ключевого идентификатора, оставляя в конечном итоге компилятор выдавать ошибку в случае коллизии из-за найденных аналогичных значений меток.
Хорошо, хорошо, мне сказали, что эти ограничения были сделаны для упрощения языковых инструментов (препроцессор, компилятор, компоновщик), а C - это не LISP, но вы можете иметь полнофункциональный интерпретатор / компиляторы LISP за долю от размера эквивалента C. , так что это не оправдание.
Вопрос в том, есть ли «расширение» для C11, которое позволяет этой штуке «toto» работать в GCC, CLANG и ... MSVC? Я не хочу идти по пути C ++ (форвардные объявления typedef больше не работают) и потому, что встроенные вещи (отсюда и вычисление хэша во время компиляции для пространственно-временного искажения).
Есть ли промежуточный язык «C +», который более «разрешительный» и «понимающий» внедрен немного лучше, например, -Praise the Lords- «перечисляет как члены битового поля», среди других приятных вещей, которых мы не можем иметь (из-за отсутствия - стандарты реальности развиваются как улитки под солнцем пустыни)?
#provemewrong, #changemymind, #norustplease