13.6 Расстройства и недоразумения
Эти проблемы, возможно, прискорбны, но нам неизвестен практический способ их решения.
- Некоторые локальные переменные не распознаются отладчиками при компиляции с оптимизацией.
Это происходит потому, что иногда GCC оптимизирует переменную, исключая её из существования. Нет способа сказать отладчику, как вычислить значение, которое «должна была иметь» такая переменная, и неясно, желательно ли это вообще. Поэтому GCC просто не упоминает удалённую переменную при записи отладочной информации.
Вы должны ожидать некоторого несоответствия между исполняемым файлом и исходным кодом, когда используете оптимизацию.
- Пользователи часто считают это ошибкой, когда GCC сообщает об ошибке для кода такого типа:
int foo (struct mumble *); struct mumble { … }; int foo (struct mumble *x) { … }Этот код действительно ошибочен, потому что область действия
struct mumbleв прототипе ограничена списком аргументов, содержащим его. Он не относится кstruct mumble, определённому в области файла сразу ниже — это два не связанных типа с похожими именами в разных областях действия.Но в определении
foo, используется тип области файла, потому что он доступен для наследования. Таким образом, определение и прототип не совпадают, и вы получаете ошибку.Это поведение может показаться странным, но именно это предписывает стандарт ISO. Вам достаточно легко исправить свой код, переместив определение
struct mumbleвыше прототипа. Не стоит создавать несовместимость с ISO C только для того, чтобы избежать ошибки в показанном выше примере. - Доступ к полям битов даже в переменных volatile осуществляется через доступ к более крупным объектам, таким как байт или слово. Вы не можете полагаться на размер объекта, который используется для чтения или записи поля битов; он может даже меняться для данного поля битов в зависимости от точного использования.
Если вам важно контролировать количество памяти, которое используется, используйте volatile, но не используйте поля битов.
- GCC поставляется с скриптами оболочки для исправления определённых известных проблем в системных заголовочных файлах. Они устанавливают исправленные копии различных заголовочных файлов в специальный каталог, где GCC обычно их и будет искать. Скрипты адаптируются к различным системам, проверяя все системные заголовочные файлы на предмет известных проблемных случаев.
Если установлены новые системные заголовочные файлы, ничего автоматически не организует обновление исправленных заголовочных файлов. Их можно обновить с помощью скрипта
mkheaders, установленного в libexecdir/gcc/target/version/install-tools/. - Например, на системах 68000 и x86 вы можете получить парадоксальные результаты, если будете проверять точные значения чисел с плавающей точкой. Например, вы можете обнаружить, что число с плавающей точкой, которое не является NaN, не равно самому себе. Это происходит из-за того, что регистры с плавающей точкой хранят на несколько бит больше точности, чем помещается в
doubleв памяти. Скомпилированный код перемещает значения между памятью и регистрами с плавающей точкой по своему усмотрению, а при перемещении в память их обрезает.Вы можете частично избежать этой проблемы, используя опцию -ffloat-store (см. Параметры оптимизации).
- На AIX и других платформах без поддержки слабых символов шаблоны необходимо явным образом инстанцировать, и символы статических членов шаблонов не будут сгенерированы.
- На AIX GCC сканирует объектные файлы и библиотечные архивы в поисках статических конструкторов и деструкторов при компоновке приложения перед тем, как компоновщик удалит неиспользуемые символы. Это необходимо для предотвращения ошибочного предположения компоновщиком AIX о том, что статический конструктор или деструктор не используется, и удаления их до проведения сканирования. Все найденные статические конструкторы и деструкторы будут использоваться, даже если модули, в которых они находятся, не используются программой. Это может привести к увеличению размера исполняемого файла и неожиданным ссылкам на символы.
Далее: Недоразумения C++, Предыдущее: Стандартные библиотеки, Наверх: Проблемы [Оглавление][Указатель]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Disappointments.html