после этого вопроса Почему gcc не допускает использование const int в качестве выражения регистра? , в основном то же, что и Какие повышенные типы используются для сравнения выражений регистра переключателя? или Есть ли способ использовать постоянный массив с постоянным индексом в качестве метки регистра переключателя в 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) для генерации уникальных значений меток регистра из идентификатора ключаоставив в конечном итоге компилятор для выдачи ошибки в случае коллизии из-за найденных похожих значений меток.
ОК, хорошо, мне сказали, что эти ограничения были сделаны для упрощения языковых инструментов (preproc, компилятор, компоновщик) и Cэто не LISP, но вы можете иметь полнофункциональный интерпретатор / компилятор LISP за долю от размера эквивалента C, так что это не оправдание.
Вопрос: есть ли «расширение» для C11, котороепросто позволяет этому "toto" работать в GCC, CLANG и ... MSVC?Я не хочу идти по пути C ++ (предварительные объявления typedef больше не работают) и потому, что встроенный материал (отсюда вычисление хеша во время компиляции для пространственно-временного искажения).
Есть ли посредник "C + «язык, который является более« разрешающим »и« понимающим », встроен немного лучше, как -Praise the Lords-« перечисляет как члены битового поля », среди других приятных вещей, которых у нас не может быть (из-за нереальных стандартов, развивающихся как улитки)под пустынным солнцем)?
# Докажем, #changemymind, # norustplease