ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
907461 Топик полностью
fk0, легенда (28.02.2019 11:48, просмотров: 674) ответил Vit на в основном неизвестны макросы препроцессора - плюс "глобальные" макроопределения, объявленные в свойствах проектов IDE, и настройки в крыжиках
Если вдаваться в детали, то и макросы сгенерированные самим компилятором (смотри по ссылке, жми кнопку Edit и смотри командную строку). Их в частности могут менять другие отдельные опции компилятора (как и поведение при компиляции, например часто https://coliru.stacked-crooked.com/a/ea1a0a16664a739f
можно сделать char знаковым или беззнаковым, в зависимости от модели памяти могут различаться ptrdiff_t и size_t). Для правильного разворачивания макросов нужно правильно проинклюдить все зависимые *.h файлы, включая C-библиотеку, файлы самого компилятора и т.п. В принципе тот же Eclipse это всё умеет (спросить у компилятора встроенный список макросов и список include файлов в т.ч., распарсить опции компилятора и отреагировать на некоторые, хотя возможно и не на все). Но это не всё. Камнем преткновения могут стать builtin функции компилятора. Парсер кода может не знать правильный их прототип и сделать неправильные выводы. Если для C такие ньюансы может не слишком принципиальны, то в C++ из-за перегрузки функций и шаблонов логика может совсем различаться в зависимости от типа данных (неправильное определение ряда типов, определённых изначально внутри компилятора, ведёт тоже к проблемам). Большим камнем преткновения встанет метапрограммирование в целом. Парсеру нужно правильно развернуть шаблоны, но для этого нужна логика компилятора практически в полном объёме, включая constexpr функции "выполняемые" в момент компиляции (появилось в C++11, в C++14 и C++17 сильно расширилось), а для последнего нужна практически полноценная компиляция и запуск, причём как бы на целевой платформе (с типами и свойствами, вроде ендианности, отличными от текущей хост-платформы). Компиляторы сейчас не имеют средств разворачивания шаблонов в C++ код (ну тот же clang или gcc-xml могут выдать внутреннее представление, но его самого распарсить та ещё задачка). Есть якобы какие-то внешние волшебные редакторы, в которых есть "тулинг" (tooling), который мол волшебно разворачивает шаблоны и всё показывает, но я это знаю только из заявлений на ютубе и вживую не видел (речь скорей про сырые разработки которые может быть в будущем выйдут на рынок). Ещё различие между компиляторами. Только недавно натыкался, в общем не тяжело написать код, который работает по-разному или не работает, или не компилируется в clang и gcc. И там всегда есть какие-нибудь implementation defined тонкости. И наконец краеугольный камень всех недостатков IDE со встроенным clang, что любая ошибка в коде, особенно где-нибудь в хидере, ломает компиляцию внутри него, и дальше у тебя всё зависимое от проблемной части кода некорректно парсится вообще. А ошибок в коде, в процессе его редактированя, полным полно.
[ZX]