-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Компилятор генерирует ошибочный код при совпадении имени функции и идентификатора #13
Comments
Более предпочтителен первый путь. Допустим, выбран второй путь. Пишется программа, компилируется, выскакивает сообщение об ошибке:
WTF? Если функция локальная или идентификатор используется только в текущей единице трансляции, то можно переименовать. Если только функция локальная, то можно переименовать идентификатор. Если идентификатор используется только здесь, то можно переименовать его. А если и то, и другое является частью интерфейса с другими компонентами? Вариант обхода — использовать венгерскую нотацию, например, начинать все идентификаторы с префикса C…, например, Таким образом, введение ограничения в язык концептуально криво, лучше решать вопрос на уровне реализации компилятора. Рассмотрим подробнее первый путь: декорирование имён функций и/или имён идентификаторов (для каждого используемого идентификатора в единице трансляции генерируется довольно хитрая конструкция, представляющая собой шаблонную структуру, именно между ней и одноимённой функцией происходит конфликт). Можно декорировать функции, объекты идентификаторов и то и другое. Во-первых, согласно описанию языка, имена функций и идентификаторов должны начинаться с большой латинской буквы, могут затем содержать любые латинские буквы (в любом регистре), цифры и знаки Во-вторых, лучше декорировать идентификаторы. Первый аргумент (слабый). В документации описана компиляция функций в целевой код — указано, что любое имя функции на Рефале отображается в такое же имя функции на C++ (есть небольшая недоработка: не указано, что знак Подытоживая. Для исправления настоящей ошибки используется подход с декорированием, идентификаторы получают префикс |
Обнаружилось, что в ходе работы над багом в код были внесены ошибки в генерации интерпретируемого кода. Поскольку основная разработка ведётся в режиме прямой кодогенерации, ошибки были замечены не сразу. |
Появление второго коммита выше связано с перезаписью коммита (ошибка в сообщении коммита). |
Если в одной единице трансляции объявить/определить функцию и где-нибудь использовать идентификатор с одним и тем же именем, компиляция в C++ пройдёт успешно, но сгенерированный файл будет приводить к ошибкам компиляции. Например, для следующего файла получим такие ошибки компиляции (компилятор g++):
Пути исправления:
The text was updated successfully, but these errors were encountered: