Spec-Zone.ru › GCC 7

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-7.5.0/gcc/Disappointments.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API