Spec-Zone.ru › GCC 5

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, но не используйте битовые поля.

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

Spec-Zone.ru

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