Spec-Zone.ru › GCC 12

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

Spec-Zone.ru

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