- •Глава 1. Сведения о компиляторе
- •1.1.Введение
- •1.2. Основные вопросы
- •1.3. Описание компилятора и документация
- •1.4. Компилятор и другие средства разработки
- •1.5. Набор возможностей компилятора
- •1.5.1. Стандарт ANSI Си
- •1.5.2. Оптимизация
- •1.5.3. Поддержка стандартной ANSI библиотеки
- •1.5.4. Гибкие модели памяти
- •1.5.5. Драйвер компилятора
- •Глава 2. Отличия 16-битового компилятора от ANSI
- •2.1. Введение
- •2.2. Основные вопросы
- •2.3. Отличия ключевых слов
- •2.3.1. Определение атрибутов переменных
- •2.3.2. Определение атрибутов функций
- •2.3.3. Inline функции
- •2.3.4. Переменные в определенных регистрах
- •2.3.4.1. Определение глобальных регистровых переменных
- •2.3.4.2. Определение локальных регистровых переменных
- •2.3.5. Комплексные числа
- •2.3.6. Целые размером в двойное слово
- •2.3.7. Ссылки на тип с помощью typeof
- •2.4. Отличия операторов
- •2.4.1. Метки как значения
- •2.4.2. Условные операторы с опущенными операндами
- •2.4.3. Диапазоны case
- •2.5. Отличия выражений
- •2.5.1. Двоичные константы
- •Глава 3. Использование компилятора в командной строке
- •3.1. Введение
- •3.2. Основные вопросы
- •3.3. Обзор
- •3.4. Соглашение для имен файлов
- •3.5. Опции
- •3.5.1. Опции, специфические для устройств dsPIC
- •3.5.2. Опции для управления типом результатов
- •3.5.3. Опции для управления диалектом Cи
- •3.5.5. Опции для отладки
- •3.5.6. Опции для управления оптимизацией
- •3.5.7. Опции для управления препроцессором
- •3.5.8. Опции для ассемблера
- •3.5.9. Опции для компоновщика
- •3.5.10. Опции для поиска в каталогах
- •3.5.11. Опции для соглашений по генерации кода
- •3.6. Переменные окружения
- •3.7. Предопределенные имена макро
- •3.9. Компиляция нескольких файлов в командной строке
- •3.10. Особенные символы
- •Глава 4. Среда периода исполнения
- •4.1. Введение
- •4.2. Основные вопросы
- •4.3. Адресное пространство
- •4.4. Запуск и инициализация
- •4.5. Пространства памяти
- •4.6. Модели памяти
- •4.6.1. Ближние и дальние данные
- •4.6.2. Ближний и дальний код
- •4.7. Расположение кода и данных
- •4.8. Программный стек
- •4.9. Использование стека в Си
- •4.11. Соглашения по вызову функций
- •4.11.1. Параметры функции
- •4.11.2. Возвращаемое значение
- •4.12. Соглашения о регистрах
- •4.13. Двоичная инверсия и модульная адресация
- •4.14.1. Загрузочные и защищенные константы
- •4.14.2. Строковые константы как аргументы
- •4.14.3. Переменные с квалификатором const в безопасной Flash
- •4.14.4. Модель совместимости объектов
- •Глава 5. Типы данных
- •5.1. Введение
- •5.2. Основные вопросы
- •5.3. Представление данных
- •5.4. Целые
- •5.5. С плавающей точкой
- •5.6. Указатели
- •Глава 6. Дополнительные типы указателей Си
- •6.1. Введение
- •6.2. Управляющие PSV указатели
- •6.2.1. Определение данных для управления доступом PSV
- •6.2.2. Управляемый доступ PSV
- •6.2.3. Рассмотрение ISR
- •6.3. PMP указатели
- •6.3.1. Инициализация PMP
- •6.3.2. Объявление нового пространства памяти
- •6.3.3. Определение переменных в пространстве PMP
- •6.4. Внешние указатели
- •6.4.1. Объявление нового пространства памяти
- •6.4.2. Определение переменных во внешнем пространстве
- •6.4.3. Определение способа доступа к пространству памяти
- •6.4.3.2. Функции записи
- •6.4.4. Пример внешней памяти
- •Глава 7. Файлы поддержки устройства
- •7.1. Введение
- •7.2. Основные вопросы
- •7.3. Файлы заголовков процессора
- •7.4. Файлы определения регистров
- •7.5. Использование SFR
- •7.6. Использование макросов
- •7.6.1. Макросы настройки битов конфигурации
- •7.6.2. Макросы использования ассемблера inline
- •7.6.3. Макросы выделения памяти данных
- •7.6.4. Макросы объявления ISR
- •7.7. Адресация EEDATA из Си - только для dsPIC30F
- •7.7.1. Доступ к EEDATA через PSV
- •7.7.2. Доступ к EEDATA посредством команд TBLRDx
- •7.7.3. Дополнительные источники информации
- •Глава 8. Прерывания
- •8.1. Введение
- •8.2. Основные вопросы
- •8.3. Написание программы обработки прерывания
- •8.3.1. Рекомендации по написанию ISR
- •8.3.3. Кодирование ISR
- •8.3.4. Использование макросов для объявления простых ISR
- •8.4. Запись вектора прерывания
- •8.4.1. Вектора прерываний dsPIC30F (без SMPS)
- •8.4.3. Вектора прерываний PIC24F
- •8.4.4. Вектора прерываний dsPIC33F/PIC24H
- •8.5. Сохранение контекста в ISR
- •8.7. Вложенные прерывания
- •8.8. Разрешение/запрещение прерываний
- •8.9. Разделение памяти между основной программой и ISR
- •8.9.1. Разработка проблем
- •8.9.2. Разработка решений
- •8.9.3. Пример приложения
- •8.10. Использование PSV в ISR
- •Глава 9. Совместное использование ассемблера и Си
- •9.1. Введение
- •9.2. Основные вопросы
- •9.3. Смесь переменных и функций на ассемблере и Си
- •9.4. Использование ассемблера inline
- •Приложение A. Определяемое реализацией поведение
- •A.12. Квалификаторы
- •A.13. Деклараторы
- •A.14. Операторы
- •A.17. Сигналы
- •A.18. Потоки и файлы
- •A.20. Errno
- •A.22. Abort
- •A.23. Exit
- •A.24. Getenv
- •A.25. Система
- •A.26. Strerror
- •Приложение B. Встроенные функции
- •B.2. Список встроенных функций
- •Приложение C. Диагностика
- •Приложение D. Компиляторы Си PIC18 и PIC24/dsPIC
- •D.6. Использование стека
- •D.11. Банк доступа
- •D.12. Inline ассемблер
- •D.13. Прагмы
- •D.14. Модели памяти
- •D.15. Соглашения о вызове
- •D.16. Код запуска
- •D.17. Управляемые компилятором ресурсы
- •D.18. Оптимизация
- •D.20. Определяемое реализацией поведение
- •D.21. Битовые поля
16-битовый компилятор Си. Руководство
3.4.Соглашение для имен файлов
Драйвер компилятора чувствителен к регистру и понимает следующие расширения имен файлов:.
ТАБЛИЦА 3-1. ИМЕНА ФАЙЛОВ
Расширение |
|
Описание |
|
|
|
file.c |
Исходный файл Cи, должен обрабатываться препроцессором. |
|
file.h |
Файл заголовка (не компилируется и не компонуется) |
|
|
|
|
file.i |
Исходный файл Си, не должен обрабатываться препроцессором |
|
|
|
|
file.o |
Объектный файл |
|
|
|
|
file.p |
Файл на ассемблере до оптимизации процедурных абстракций |
|
|
|
. |
file.s |
Файл на ассемблере |
A |
|
|
|
file.S |
Файл на ассемблере, должен обрабатываться препроцессором |
|
|
|
|
Прочее |
Файлы, которые будут переданы компоновщику |
|
|
|
|
3.5. |
Опции |
Wilson |
|
|
|
|
Компилятор имеет много опций для управления компиляцией и все они |
|
|
чувствительны к регистру. |
|
|
• Опции, специфические для устройств dsPIC |
|
|
• Опции для управления типом результатов |
|
|
• Опции для управления диалектом Cи |
|
|
|
by |
|
• Опции управления предупреждениями и сообщениями об ошибках |
|
|
• Опции для отладки |
|
|
Translated |
|
• Опции для управления оптимизацией
• Опции для управления препроцессором
• Опции для ассемблера
• Опции для компоновщика
• Опции для поиска в каталогах
• Опции для соглашений по генерации кода
3.5.1. Опции, специфические для устройств dsPIC
Более подробно о моделях памяти, см п. 4.6 «Модели памяти».
ТАБЛИЦА 3-2. ОПЦИИ, СПЕЦИФИЧЕСКИЕ ДЛЯ dsPIC®
Опция |
Описание |
|
|
-mconst-in-code |
Константы размещаются в пространство auto_psv. Компилятор |
|
организует доступ к этим константам через окно PSV. (Умолчание.) |
|
|
-mconst-in-data |
Константы размещаются в пространстве памяти данных |
|
|
-merrata= |
Эта опция разрешает специфическую обработку ошибок, |
id[,id]* |
определенных идентификатором id. Разрешенные значения id |
|
изменяются время от времени и возможно не потребуются для |
|
конкретного варианта. Получить список поддерживаемых текущим |
|
вариантом идентификаторов ошибок и их краткое описание можно |
|
задав list вместо id. Задав all вместо id можно разрешить |
|
обработку всех поддерживаемых текущим вариантом ошибок. |
|
|
DS51284H(ru) стр. 3-2 |
© 2008 Microchip Technology Inc. |
Глава 3. Использование компилятора в командной строке
ТАБЛИЦА 3-2. (ПРОД-Е) ОПЦИИ, СПЕЦИФИЧЕСКИЕ ДЛЯ dsPIC®
|
Опция |
|
|
|
Описание |
|
|
|
|
|
|
|
|||||
|
-mlarge-code |
|
Компиляция с использованием большой модели кода. О локальности |
|||||
|
|
|
вызываемых функций никаких допущений не делается. |
|
||||
|
|
|
Когда опция выбрана, одиночные функции, которые больше 32К не |
|||||
|
|
|
поддерживаются и могут вызвать ошибку ассемблирования, т.к. все |
|||||
|
|
|
инструкции ветвления внутри функции имеют короткую форму |
|||||
|
|
|
|
|||||
|
-mlarge-data |
|
Компиляция с использованием большой модели данных. Не делается |
|||||
|
|
|
никаких допущений о расположении статических и глобальных |
|||||
|
|
|
переменных. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-mcpu=target |
|
|
|
. |
|
|
|
|
|
Опция задает идентификатор типа процессора (и сообщает его |
||||||
|
|
|
ассемблеру и компоновщику, если они используются). Эта опция |
|||||
|
|
|
влияет на установку некоторых предопределенных констант. |
|||||
|
|
|
Подробнее см. п. 3.7. Полный списокA |
поддерживаемых контроллеров |
||||
|
|
|
|
Wilson |
|
|
|
|
|
|
|
см в файле Readme.htm, который приходит вместе с поставкой. |
|||||
|
-mpa(1) |
|
Разрешает оптимизацию процедурных абстракций. Уровень |
|||||
|
|
|
вложенности неограничен. |
|
|
|
||
|
-mpa=n(1) |
|
Разрешает оптимизацию процедурных абстракций до уровня n. Если |
|||||
|
|
|
n — ноль, оптимизация запрещена. Если n=1, первый уровень |
|||||
|
|
|
абстракции разрешен, т.е. последовательность команд в исходном |
|||||
|
|
|
коде может быть абстрагирована в подпрограмму. Если n=2, второй |
|||||
|
|
|
уровень абстракции разрешен, т.е. инструкции, которые были |
|||||
|
|
|
помещены в подпрограмму на первом уровне, могут быть |
|
||||
|
|
|
абстрагированы в подпрограмму на один уровень глубже. |
|
||||
|
|
|
|
by |
|
|
|
|
|
|
|
Аналогичные построения можно продолжать для больших значений n. |
|||||
|
-mno-pa(1) |
|
Оптимизация процедурных абстракций запрещена (Умолчание.) |
|||||
|
|
|
|
|
|
|
|
|
|
Translated |
|
|
|
|
|
|
|
|
Примечание 1. Процедурные абстракции ведут себя как inline функции наоборот. Подход |
|||||||
|
|
состоит в том, чтобы выделить множество повторяющихся |
||||||
|
|
последовательностей кода в пределах единицы трансляции и разместить их |
||||||
|
|
в общей области кода. Хотя эта опция не улучшает скорости исполнения |
||||||
|
|
сгенерированного кода, она может существенно снизить его объем. |
||||||
|
|
Программы, откомпилированные с -mpa могут быть тяжелее для отладки, |
||||||
|
|
поэтому не рекомендуется использовать эту опцию при отладке с |
||||||
|
|
использованием объектного формата COFF. |
|
|
||||
|
|
Процедурный абстрактор вызывается на отдельной фазе компиляции, |
||||||
|
|
после создания файла ассемблерного кода. Эта фаза не оптимизирует код |
||||||
|
|
за пределами единицы трансляции. Когда процедурная оптимизация |
||||||
|
|
разрешена, ассемблерный код должен содержать только разрешенные |
||||||
|
|
машинные |
команды. |
Запрещенные |
команды |
и |
командные |
|
|
|
последовательности, либо директивы ассемблера (директивы секций, |
||||||
|
|
макросы, включение файлов и т.п.) не должны использоваться, иначе фаза |
||||||
|
|
процедурной абстракции окончится неудачей и создание выходного файла |
||||||
|
|
будет запрещено. |
|
|
|
|
||
|
|
|
|
|
||||
|
-mno-isr-warn |
|
По умолчанию компилятор выдает предупреждение, если |
|
||||
|
|
|
__interrupt__ не присоединен к опознанному имени вектора |
|||||
|
|
|
прерывания. Данная опция запрещает такое предупреждение. |
|||||
|
|
|
|
|||||
|
-momf=omf |
|
Задает формат объектного модуля (OMF, Object Module Format), |
|||||
|
|
|
производимый компилятором. |
|
|
|
||
|
|
|
Спецификатор omf может быть одним из: |
|
|
|||
|
|
|
coff |
создается объектный файл формата COFF (Умолчание.) |
||||
|
|
|
elf |
создается объектный файл формата ELF. |
|
|
||
|
|
|
Для отладки объектных файлов ELF используется формат отладки |
|||||
|
|
|
DWARF 2.0. |
|
|
|
|
|
|
|
|
|
|||||
|
-msmall-code |
|
Компиляция с использованием малой модели кода. Предполагается, |
|||||
|
|
|
что вызываемые функции близко (в пределах 32К слов от точки |
|||||
|
|
|
вызова) (Умолчание.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-3 |
16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-2. (ПРОД-Е) ОПЦИИ, СПЕЦИФИЧЕСКИЕ ДЛЯ dsPIC®
Опция |
Описание |
|
|
-msmall-data |
Компиляция с использованием малой модели данных. Все |
|
статические и внешние переменные предполагаются находящимися в |
|
младших 8Кб адресного пространства данных (Умолчание.) |
|
|
-msmall-scalar |
То же, что и -msmall-data, но в младших 8Кб адресного |
|
пространства данных должны находиться только скалярные |
|
статические и внешние переменные. (Умолчание.) |
|
|
-mtext-name |
Спецификация -mtext=name приводит к тому, что код программы |
|
. |
|
будет помещен в секцию с именем name, а не в секцию .text, как по |
|
умолчанию. До и после знака = не должно быть пробелов. |
-msmart-io |
A |
Эта опция попытки статического анализа строки формата |
|
[=0|1|2] |
передаваемой в printf, scanf, а также ‘f’ и ‘v’ вариации этих |
|
функций. Использование аргументов, кроме имеющих формат с |
|
Wilson |
|
плавающей точкой, будет преобразовано так, чтобы применялись |
|
только целочисленные варианты библиотечных функций. |
|
-msmart-io=0 отключает эту опцию, тогда как -msmart-io=2 |
|
заставляет компилятор быть оптимистом и преобразовывать вызовы |
|
функций с переменным или неизвестным аргументами формата. |
|
-msmart-io=1 (умолчание) преобразуются только проверенные |
|
литеральные величины. |
|
|
3.5.2. Опции для управления типом результатов
Следующие опции управляют типом результатов, производимых компилятором.
|
|
by |
|
ТАБЛИЦА 3-3. ОПЦИИ УПРАВЛЕНИЯ ТИПОМ РЕЗУЛЬТАТОВ КОМПИЛЯЦИИ |
|||
|
Опция |
|
Описание |
|
|
|
|
|
-c |
Компиляция и ассемблирование исходных файлов без компоновки. |
|
|
Translated |
c-header |
|
|
|
Расширение имени файла по умолчанию .o. |
|
|
-E |
Остановка после стадии препроцессорной обработки, т.е. перед |
|
|
|
запуском собственно компилятора. Выходной файл по умолчанию |
|
|
|
выводится на stduot. |
|
|
-o file |
Направление вывода в файл file. |
|
|
-S |
Остановка после непосредственной компиляции, (т.е. перед вызовом |
|
|
|
ассемблера). Расширение имени выходного файла по умолчанию .s. |
|
|
-v |
Печать команд, выполняемых на каждой стадии компиляции. |
|
|
-x |
Вы можете явно указать входной язык с использованием опции -x: |
|
|
|
-x language |
|
|
|
Определяйте явно язык для последующих за опцией входных файлов |
|
|
|
(а не заставляйте компилятор выбирать его на основе суффиксов |
|
|
|
имен файлов). Эта опция действует для всей последовательности |
|
|
|
входных файлов, пока не встретится другая опция -x |
|
|
|
Параметр language может принимать значения: |
|
|
|
c |
|
|
|
cpp-output |
|
|
|
assembler |
|
|
|
assembler-with-cpp |
|
|
|
none — отключает спецификацию языка, поэтому следующие за ней |
|
|
|
файлы будут обрабатываться в соответствии с суффиксами своих |
|
|
|
имен. Это умолчание, но использовать такой параметр надо, если |
|
|
|
перед этим язык был задан явно опцией -x. Например: |
|
|
|
pic30-gcc -x assembler foo.asm bar.asm -x none main.c |
|
|
|
mabonga.c |
|
|
|
Без использования -x none компилятор принял бы все входные |
|
|
|
файлы за ассемблерные. |
|
|
|
|
|
|
--help |
Печать описания опций командной строки |
|
|
|
|
|
DS51284H(ru) стр. 3-4 |
© 2008 Microchip Technology Inc. |
Глава 3. Использование компилятора в командной строке
3.5.3. Опции для управления диалектом Cи
Следующие опции определяют диалект Си, используемый компилятором.
ТАБЛИЦА 3-4. ОПЦИИ ДИАЛЕКТА СИ
Опция |
|
Описание |
|
|
|
-ansi |
|
Поддержка всего (и не более) стандарта ANSI Си |
-aux-info filename |
|
Вывод в заданный именем filename файл прототипов |
|
|
деклараций для всех функций, объявленных и/или |
|
|
определенных в единице трансляции, включая файлы |
|
|
заголовка. Эта опция молча игнорируется в любом языке, |
|
|
кроме Cи. Помимо деклараций, файл содержит в форме |
|
|
A |
|
|
комментариев: источник.каждой декларации (исходный файл |
|
|
и строка), была ли декларация неявной, прототипом или не |
|
|
прототипом (обозначено соответственно буквами I, N для |
|
|
Wilson |
|
|
новой формы или O для старой, в первом символе после |
|
|
номера строки и двоеточия), и была ли это декларация или |
|
|
определение (C или F, соответственно, в следующем |
|
|
символе). В случае определений функций, в комментариях, |
|
|
после декларации, добавляется также список аргументов в |
|
|
стиле K&R (Кернигана и Ритчи), сопровождаемых их |
|
|
декларациями. |
|
|
|
-ffreestanding |
|
Объявление, что компиляция происходит в автономной |
|
|
среде. Это подразумевает -fno-builtin. Автономная |
|
|
среда — это среда, которой нет стандартной библиотеки и |
|
|
запуск в программы необязательно может быть из main. |
|
by |
|
|
|
Наиболее очевидный пример — ядро ОС. Опция |
|
|
эквивалентна -fno-hosted. |
-fno-asm |
|
Не распознавать asm, inline и typeof как ключевые |
Translated |
|
слова, поэтому код может использовать их в качестве |
|
идентификаторов. Вместо них можно использовать ключевые |
|
|
|
|
|
|
слова __asm__, __inline__ и __typeof__. |
|
|
Использование опции -ansi предполагает -fno-asm |
|
|
|
-fno-builtin |
|
Не распознавать встроенных функций, которые не |
-fno-builtin-function |
|
начинаются с префикса __builtin__. |
|
|
|
-fsigned-ch |
|
Тип char будет знаковым, как signed char (Умолчание.) |
|
|
|
-fsigned-bitfields |
|
Эти опции позволяют устанавливать, будут ли битовые поля |
-funsigned-bitfields |
|
знаковыми или нет, когда это явно не указано в их |
-fno-signed-bitfields |
|
декларации. По умолчанию, такие битовые поля будут |
-fno-un igned-bitfields знаковыми, если не использована опция -traditional, при |
||
|
|
которой битовые поля всегда беззнаковые. |
|
|
|
-funsigned-char |
|
Тип char будет беззнаковым, как unsigned char |
|
|
|
-fwrit ble-string |
|
Предписывает сохранять строки в сегменте данных |
|
|
доступном для записи и не делать их уникальными |
|
|
|
3.5.4. Опции управления предупреждениями и сообщениями об ошибках
Предупреждения — это диагностические сообщения, которые информируют о конструкциях, не ошибочных по сути, но рискованных или потенциально ошибочных.
Вы можете запросить множество специфических предупреждений с помощью опций, начинающихся на -W, например, -Wimplicit, чтобы запрашивать предупреждения о неявных декларациях. Каждая из этих опций специфических предупреждений также имеет отрицательную форму, начинающуюся на -Wno-, чтобы выключать предупреждения, например, -Wno-implicit. Это руководство включает описание только одной из двух форм, той, что не принята по умолчанию.
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-5 |
16-битовый компилятор Си. Руководство
Следующие опции управляют количеством и типами предупреждений, выдаваемых компилятором.
ТАБЛИЦА 3-5. ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция |
|
|
Описание |
|
|
|
|
-fsyntax-only |
|
Синтаксическая проверка кода, и ничего более |
|
-pedantic |
|
Вывод всех предупреждений, требуемых полным ANSI Си, |
|
|
|
отклонение все программ, использующих запрещенные |
|
|
|
расширения. |
|
|
|
|
|
-pedantic-errors |
|
|
. |
|
То же, что и -pedantic, но с предпочтением сообщений об |
||
|
|
ошибках перед предупреждениями. |
|
-w |
|
A |
|
|
Запрет всех предупреждений |
||
-Wall |
|
Используются вместе все опции, представленные в данной |
|
|
|
таблице. Это разрешает все предупреждения о конструкциях, |
|
|
|
Wilson |
|
|
|
которые часть пользователей рассматривает как |
|
|
|
сомнительные, и которых легко избежать (или |
|
|
|
модифицировать, чтобы предотвратить предупреждение), |
|
|
|
даже в соединении с макросами. |
|
-Wchar-subscripts |
|
Предупредить, когда индекс массива имеет тип char |
|
-Wcomment |
|
Предупредить, всякий раз, когда последовательность начала |
|
-Wcomments |
|
комментария /* обнаруживается в комментарии типа /* или |
|
|
|
всякий раз, когда \n появляется в комментарии типа // |
|
|
|
|
|
-Wdiv-by-zero |
|
Предупредить о делении на 0 на этапе компиляции. Для |
|
|
|
заперта такого предупреждения используйте |
|
|
by |
|
|
|
|
-Wno-div-by-zero |
|
-Werror-implicit- |
|
Предупредить всякий раз при использовании функции до ее |
|
function-declaration |
|
декларации |
|
-Wformat |
|
Проверять функции printf, scanf и т.п., чтобы |
|
Translated |
|
удостовериться, что типы использованных аргументов |
|
|
соответствуют заданной строке формата. |
||
|
|
||
|
|
|
|
-Wimplicit-int |
|
Предупредить, когда в декларации не задан тип. |
|
|
|
|
|
-Wmain |
|
Предупредить, если тип main вызывает подозрения. main |
|
|
|
должна быть функцией с внешней связью, возвращающей |
|
|
|
тип int, и принимающей ноль, два либо три аргумента |
|
|
|
соответствующих типов. |
|
|
|
|
|
-Wmissing-braces |
|
Предупредить, если инициализация объединения или союза |
|
|
|
не полностью заключена в скобки. Ниже приведены примеры |
|
|
|
не правильной (a) и правильной (b) инициализации: |
|
|
|
int a[2][2] = { 0, 1, 2, 3 }; |
|
|
|
int b[2][2] = { { 0, 1 }, { 2, 3 } }; |
|
|
|
|
|
-Wmultichar |
|
Предупредить, если использована многосимвольная char |
|
-Wno-multichar |
|
константа. Обычно такие константы являются печатными |
|
|
|
ошибками. Поскольку их значение зависит от реализации, они |
|
|
|
не должны использоваться в переносимом коде. Следующий |
|
|
|
пример иллюстрирует использование многосимвольных char |
|
|
|
констант: |
|
|
|
char xx(void) |
|
|
{ |
|
|
|
|
return(‘xx’); |
|
|
} |
|
|
|
|
|
|
-Wparentheses |
|
Предупреждает, если круглые скобки опущены в |
|
|
|
определенном контексте, таком как присвоение в контексте, |
|
|
|
где предполагается истинное значение, или, когда операторы |
|
|
|
вложены так, что человеку часто трудно определит порядок |
|
|
|
исполнения. |
|
|
|
|
|
DS51284H(ru) стр. 3-6 |
© 2008 Microchip Technology Inc. |
Глава 3. Использование компилятора в командной строке
ТАБЛИЦА 3-5. (ПРОД-Е) ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция
-Wreturn-type
-Wsequence-point
Translated
-Wswitch
|
Описание |
Предупреждать всегда, когда возвращаемый результат |
|
функции определен по умолчанию как int. Также |
|
предупреждать, когда обнаруживается оператор return без |
|
возвращаемого значения в функции, возвращаемый тип |
|
которой определен как не void. |
|
Предупреждать о коде, который может иметь |
|
неопределенную семантику из-за нарушения правил точки |
|
упорядочивания (sequence point rules) стандарта Си. |
|
|
. |
Стандарт Си определяет порядок вычисления выражения в |
|
A |
|
Си программе в терминах точек упорядочивания, которые |
|
представляют поэтапную очередность между выполнением |
|
частей программы: то, что выполнено перед точкой |
|
Wilson |
|
упорядочивания, и то, что выполнено после нее. Это имеет |
|
место после вычисления полного выражения (которое не |
|
является частью большего выражения), после вычисления |
|
первого операнда для операторов &&, ||, ? : или , |
|
(запятой), перед вызовом функции (но после вычисления ее |
|
аргументов и выражений, свидетельствующих о вызове |
|
функции) и в ряде других ситуаций. За исключением случаев, |
|
определенных правилами точек упорядочивания, |
|
очередность вычисления подвыражений в выражении не |
|
определена. Все эти правила описывают только частичный |
|
порядок, а не общий, т.е., например, если две функции |
|
вызваны в пределах одного выражения без точки |
|
by |
|
упорядочивания между ними, очередность, в которой |
|
функции вызываются, не определена. Несмотря на это, |
|
комитет стандартов установил, что вызовы функций не |
|
должны перекрываться. |
|
Момент, когда между точками упорядочивания вступает в |
|
силу изменение значений объектов, не определен. |
|
Программы, чье поведение зависит от этого, ведут себя |
|
непредсказуемо; стандарт Cи определяет, что «Между |
|
предыдущей и следующей точкой последовательности, |
|
объект должен иметь хранимую величину |
|
модифицированной, самое большое, один раз при |
|
вычислении выражения. Больше того, предшествующее |
|
значение должно быть прочитано, только чтобы определить |
|
величину, которую нужно сохранить.» Если программа |
|
нарушает эти правила, результаты в любой конкретной |
|
реализации полностью непредсказуемы. |
|
Примеры кода с неопределенным поведением: |
|
a = a++; a[n] = b[n++]; a[i++] = i;. |
|
Некоторые более сложные случаи не диагностируются этой |
|
опцией, что может дать случайный ложный положительный |
|
результат, но в общем она признается довольно эффективной |
|
в обнаружении проблем такого рода в программах. |
|
Предупреждать всегда, когда оператор switch имеет индекс |
|
типа перечисления и опущены варианты для одного или более |
|
кодов перечисления. (Наличие варианта «по умолчанию» |
|
отменяет предупреждение). Метка case за пределами |
|
диапазона перечисления также провоцирует |
|
предупреждение при использовании этой опции. |
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-7 |
16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-5. (ПРОД-Е) ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция |
|
|
Описание |
|
|
|
|
-Wsystem-headers |
|
Вывод предупреждения для конструкций, найденных в |
|
|
|
файлах системных заголовков. Предупреждения от |
|
|
|
системных заголовков обычно подавляются на основании |
|
|
|
предположения о том, что они, как правило, не отражают |
|
|
|
реальной проблемы, а только затрудняют чтение выводимой |
|
|
|
компилятором информации. Использование этой опции |
|
|
|
командной строки предписывает компилятору выдавать |
|
|
|
предупреждения от системных заголовков, как будто они |
|
|
|
|
. |
|
|
обнаружены в коде пользователя. Тем не менее, обратите |
|
|
|
A |
|
|
|
внимание, что использование -Wall вместе с этой опцией не |
|
|
|
будет предупреждать о неизвестных прагмах в системных |
|
|
|
заголовках. Для таких целей следует использовать опцию |
|
|
|
Wilson |
|
|
|
-Wunknown-pragmas. |
|
-Wtrigraphs |
|
Предупредить при обнаружении любого триграфа |
|
|
|
(подразумевается, что они разрешены.) |
|
-Wuninitialized |
|
Предупредить, если автоматическая переменная |
|
|
|
используется без предварительной инициализации. |
|
|
|
Эти предупреждения разрешены, только если включена |
|
|
|
оптимизация, поскольку они требуют информации о потоке |
|
|
|
данных, которая вычисляется только при оптимизации. |
|
|
|
Эти предупреждения имеют место только для переменных, |
|
|
|
которые являются кандидатами на размещение в регистрах. |
|
|
|
Таким образом, они не появляются для переменных, которые |
|
|
|
были объявлены как volatile, или адрес которых имеется, |
|
|
|
или размер которых отличается от 1, 2, 4 или 8 байтов. Также |
|
|
|
они не появляются для структур, союзов и массивов, даже |
|
|
|
если они размещены в регистрах. |
|
Translated |
byЗаметьте, что может не быть предупреждения о переменной, |
||
|
используемой только для вычисления значения, которое само |
||
|
|
||
|
|
никогда не применяется, поскольку такое вычисление может |
|
|
|
быть удалено при анализе потока данных до того, как |
|
|
|
предупреждение будет выдано. |
|
|
|
|
|
-Wunknown-pragmas |
|
Предупредить, когда встретилась директива #pragma, |
|
|
|
которая непонятна компилятору. Когда используется данная |
|
|
|
опция командной строки, предупреждения выдаются, даже |
|
|
|
если неизвестная прагма встретится в файлах системных |
|
|
|
заголовков. Этого не происходит, если предупреждения |
|
|
|
разрешены только опцией -Wall. |
|
|
|
|
|
-Wunused |
|
Предупредить всякий раз, если переменная не используется |
|
|
|
нигде, кроме декларации, если функция объявлена как |
|
|
|
static, но никогда не определена, если метка объявлена, |
|
|
|
но не использована, и, если оператор вычислил результат, |
|
|
|
который явно не используется. |
|
|
|
При необходимости получать предупреждения о |
|
|
|
неиспользуемом параметре функции, опции -W и -Wunused |
|
|
|
должны быть заданы вместе. |
|
|
|
Приведение выражений к типу void подавляет данные |
|
|
|
предупреждения для выражений. Аналогично, атрибут |
|
|
|
unused подавляет данные предупреждения по отношению к |
|
|
|
неиспользуемым переменным, параметрам и меткам. |
|
|
|
|
|
-Wunused-function |
|
Предупредить всякий раз, когда статическая функция |
|
|
|
объявлена, но не определена, или не inline статическая |
|
|
|
функция не используется. |
|
|
|
|
|
-Wunused-label |
|
Предупредить всякий раз, когда метка объявлена, но не |
|
|
|
используется. Для подавления этого предупреждения |
|
|
|
используйте атрибут unused (см. п. 2.3.1. «Определение |
|
|
|
атрибутов переменных».) |
|
|
|
|
|
DS51284H(ru) стр. 3-8 |
© 2008 Microchip Technology Inc. |
Глава 3. Использование компилятора в командной строке
ТАБЛИЦА 3-5. (ПРОД-Е) ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция |
Описание |
|
|
|
|
-Wunused-parameter |
Предупредить всякий раз, когда обнаруживается параметр |
|
|
функции, не использованный нигде, кроме своей декларации. |
|
|
Для подавления предупреждения используйте атрибут |
|
|
unused (см. п. 2.3.1. «Определение атрибутов переменных».) |
|
|
|
|
-Wunused-variable |
Предупредить всякий раз, когда локальная или не |
|
|
константная статическая переменная не используется нигде, |
|
|
кроме своей декларации. Для подавления предупреждения |
|
|
используйте атрибут unused (см. п. 2.3.1. «Определение |
|
|
. |
|
|
атрибутов переменных» ) |
|
-Wunused-value |
Предупредить всякий раз, когда оператор вычисляет |
|
|
результат, который явно нигде не используется. Для |
|
|
подавления предупрежденияA |
приводите выражение к типу |
|
Wilson |
|
|
void. |
|
Следующие опции -W не предполагаются опцией -Wall. Некоторые из них предупреждают о конструкциях, которые пользователи обычно не рассматривают как сомнительные, но которые иногда требуется проверить. Другие предупреждают о конструкциях, которые необходимы или которых трудно избежать в определенных ситуациях, и не существует простых способов модификации кода, чтобы подавить предупреждения о них.
by Translated
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-9 |
16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-6. ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, НЕ ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция
-W
Translated
-Waggregate-return
-Wbad-function-cast
-Wcast-align
Описание
Выдать дополнительные предупреждения для событий:
• Когда nonvolatile автоматическая переменная могла быть |
|
изменена вызовом longjmp. Эти предупреждения |
|
возможные только при оптимизирующей компиляции. |
|
Компилятор видит только вызовы setjmp. Он не может |
|
знать, где будет вызван longjmp; фактически, обработчик |
|
|
. |
сигнала мог бы вызвать его в любой точке кода. В |
|
A |
|
результате, предупреждение может выдаваться даже |
|
тогда, когда фактически проблемы нет, поскольку longjmp |
|
не может в действительности быть вызван в месте, которое |
|
Wilson |
|
должно породить проблему. |
|
• Когда из функции можно выйти и через return value; и |
|
через return;. Завершение тела функции без оператора |
|
возврата трактуется как return;. |
|
• Когда оператор выражения или левая часть выражения с |
|
операндом «запятая» не имеют побочного эффекта. Для |
|
подавления сообщения приведите неиспользуемое |
|
выражение к типу void. Например, такое выражение, как |
|
x[i,j] вызовет предупреждение, а x[(void)i,j] — нет. |
|
• Когда беззнаковая величина сравнивается с нулем с |
|
помощью операций < или <= |
|
•Когда появляется сравнение, похожее на x<=у<=z, которое |
|
эквивалентно (x<= y ? 1 : 0)<=z, которое |
|
интерпретируется иначе, нежели его обычная |
|
by математическая запись. |
• Когда спецификация класса памяти, такая как static, не стоит на первом месте в декларации. Согласно стандарту Си, такое употребление устарело.
• Когда заданы опции -Wall или -Wunused и имеют место неиспользуемые аргументы.
• Когда при сравнении знаковой и беззнаковой величин может получиться неправильный результат, если знаковая величина преобразуется в беззнаковую. (Предупреждение не выдается, если задана опция -Wno-sign-compare.)
• Когда объединение имеет не полностью заключенный в фигурные скобки инициализатор. Например, следующий код вызовет предупреждение, т.к. пропущены скобки вокруг инициализатора x.h:
struct s { int f, g; };
struct t { struct s h; int i; }; struct t x = { 1, 2, 3 };
• Когда в объединении инициализируются не все члены. Например, следующий код вызовет предупреждение, т.к. x.h неявно инициализируются нулем:
struct s { int f, g, h; }; struct s x = { 3, 4 };
Предупредить, если определена или вызвана функция, которая возвращает структуру или союз.
Предупредить всякий раз, когда вызов функции приводится к несоответствующему типу. Например, предупредить, если функция int foof() приводится к указателю.
Предупредить всякий раз, когда приведение указателя повышает выравнивание. Например, предупредить, если char * приводится к int *.
DS51284H(ru) стр. 3-10 |
© 2008 Microchip Technology Inc. |
Глава 3. Использование компилятора в командной строке
ТАБЛИЦА 3-6. (ПРОД-Е) ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, НЕ ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция |
|
|
Описание |
|
|
|
|
-Wcast-qual |
|
Предупредить всякий раз, когда приведение указателя |
|
|
|
вызывает потерю квалификатора в типе указуемого объекта. |
|
|
|
Например, предупредить, если const char * приводится к |
|
|
|
просто char *. |
|
|
|
|
|
-Wconversion |
|
Предупредить, если прототип вызывает преобразование типа |
|
|
|
отличное от того, которое было бы с тем же аргументом при |
|
|
|
отсутствии прототипа. Это включает преобразования |
|
|
|
целочисленных типов в плавающие и т.п., и преобразования, |
|
|
|
|
. |
|
|
меняющие размер или знаковость целочисленного |
|
|
|
|
A |
|
|
аргумента, кроме тех, что совпадают с целочисленным |
|
|
|
расширением. |
|
|
|
Также предупреждает, если отрицательная целая константа |
|
|
|
Wilson |
|
|
|
неявно приводится к беззнаковому типу. Например, |
|
|
|
предупреждает об присваивании x = -1, если x |
|
|
|
беззнаковое. Предупреждение не выдается для явного |
|
|
|
приведения типа, вроде (unsigned) -1. |
|
-Werror |
|
Делает все предупреждения сообщениями об ошибках |
|
-Winline |
|
Предупредить, если функция не может быть использована |
|
|
|
inline, даже если она была объявлена inline или была |
|
|
|
задана опция -finline-functions. |
|
|
|
|
|
-Wlarge-than-len |
|
Предупредить всякий раз, когда определяется объект, в |
|
|
|
байтах больший, чем задано параметром len. |
|
|
|
|
|
-Wlong-long |
|
Предупредить, если используется тип long long |
|
-Wno-long-long |
by |
|
|
|
(умолчание). Для подавления предупреждений используйте |
||
|
|
-Wno-long-long. Признак предупреждений по опциям |
|
|
|
-Wlong-long и -Wno-long-long принимается во внимание, |
|
|
|
только если использована опция -pedantic. |
|
|
|
|
|
Translated |
|
Предупредить, если глобальная функция определена без |
|
-Wmissing-declarations |
|
||
|
|
предыдущего объявления. Предупреждает, даже если |
|
|
|
определение само содержит прототип. |
|
-Wmissing- |
|
Если опция -Wformat включена, также предупредить о |
|
format-attribu |
|
функциях, которые могут быть кандидатами на использование |
|
|
|
атрибутов формата. Заметьте, что речь идет именно о |
|
|
|
возможных кандидатах, а не о точно заданных функциях. Эта |
|
|
|
опция не работает, если не включена опция -Wformat. |
|
-Wmissing-noreturn |
|
Предупредить о функциях, которые могут быть кандидатами |
|
|
|
на атрибут noreturn. Это именно возможные кандидаты, а |
|
|
|
не точно заданные таковые функции. Следует уделить особое |
|
|
|
внимание проверке функций вручную. Действительно, не |
|
|
|
следует возвращаться перед использованием атрибута |
|
|
|
noreturn, в противном случае может быть внесена |
|
|
|
трудноуловимая ошибка генерации кода. |
|
|
|
|
|
-Wmissing-prototypes |
|
Предупредить, если глобальная функция определена без |
|
|
|
предыдущего объявления прототипа. Предупреждает, даже |
|
|
|
если определение само содержит прототип. (Это |
|
|
|
предупреждение можно использовать, чтобы определить |
|
|
|
глобальные функции, не объявленные в файлах заголовка.) |
|
|
|
|
|
-Wnested-extern |
|
Предупредить, если декларация extern встретилась внутри |
|
|
|
функции. |
|
|
|
|
|
-Wno-deprecated- |
|
Не предупреждать о функциях, переменных и типах, |
|
declaration |
|
снабженных атрибутом deprecated. |
|
|
|
|
|
-Wpadded |
|
Предупредить, если заполнение включено в структуру для |
|
|
|
выравнивания элемента структуры или для выравнивания |
|
|
|
структуры целиком. |
|
|
|
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-11 |
16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-6. (ПРОД-Е) ОПЦИИ ПРЕДУПРЕЖДЕНИЙ, НЕ ПОДРАЗУМЕВАЕМЫЕ -Wall
Опция |
|
|
Описание |
|
|
|
|
-Wpointer-arith |
|
Предупредить о чем-то, что зависит от размера типа функции |
|
|
|
или от размера void. Компилятор назначает этим типам |
|
|
|
размер = 1, для удобства вычислений с void * указателями |
|
|
|
и указателями на функции. |
|
|
|
|
|
-Wredundant-decls |
|
Предупредить если что-то объявляется неоднократно в ту же |
|
|
|
область, даже в случаях, когда многократная декларация |
|
|
|
правомерна и ничего не изменяет. |
|
|
|
|
|
-Wshadow |
|
. |
|
|
Предупредить всякий раз, когда одна локальная переменная |
||
|
|
затеняет другую локальную переменную. |
|
-Wsign-compare |
|
Предупредить, когда сравнение знаковой и беззнаковой |
|
-Wno-sign-compare |
|
величин может дать неверный результат, если знаковая |
|
|
|
величина преобразуетсяA |
в беззнаковую. Это |
|
|
Wilson |
|
|
|
предупреждение также разрешается опцией -W. Чтобы |
|
|
|
получать другие предупреждения опции -W кроме этого |
|
|
|
предупреждения, используйте -Wno-sign-compare |
|
-Wstrict-prototypes |
|
Предупредить, если функция объявлена или определена без |
|
|
|
задания типов аргументов. (Без предупреждения |
|
|
|
допускается определение функции в старом стиле, если оно |
|
|
|
предваряется декларацией, которая определяет типы |
|
|
|
аргументов.) |
|
|
|
|
|
-Wtraditional |
|
Предупредить об отдельных конструкциях, которые ведут |
|
|
|
себя по-разному в традиционном и ANSI Си. |
|
|
|
• Аргумент макро внутри строковой константы в теле |
|
|
|
макроса. Это вызывает подстановку аргумента в |
|
|
|
классическом Cи, но в ANSI Cи аргумент остается частью |
|
|
|
строки. |
|
Translated |
by•Функция объявляется внешней в блоке и затем используется |
||
|
после его окончания. |
|
|
|
|
|
|
|
|
• Оператор switch имеет операнд типа long. |
|
|
|
• Декларация нестатической функции следует за такой же |
|
|
|
статической. Эта конструкция не принимается некоторыми |
|
|
|
традиционными компиляторами Си. |
|
|
|
|
|
-Wundef |
|
Предупредить, если неопределенный идентификатор |
|
|
|
используется в директиве #if |
|
|
|
|
|
-Wunreachab -code |
|
Предупредить, если компилятор определил код, который |
|
|
|
никогда не будет исполнен. Эта опция может выдавать |
|
|
|
предупреждение, даже если существуют условия, при |
|
|
|
которых часть неиспользуемой строки может быть |
|
|
|
выполнена, так что следует проявлять определенную |
|
|
|
аккуратность при удалении очевидно недоступного кода. |
|
|
|
Например, для inline функции, предупреждение может |
|
|
|
означать, что строка недоступна в только одной встроенной |
|
|
|
копии функции. |
|
|
|
|
|
-Wwrite-strings |
|
Задание строковых констант типа const char[length] так, |
|
|
|
что копирование их адресов в неконстантный указатель |
|
|
|
char * приведет к предупреждению. Это предупреждение |
|
|
|
поможет вам в поиске кода периода компиляции, который вы |
|
|
|
пытаетесь записать в строковую константу, но только, если |
|
|
|
вы будете очень аккуратны в использовании const в |
|
|
|
декларациях и прототипах. В противном случае это может |
|
|
|
просто обернуться неудобствами, из-за чего запрос данного |
|
|
|
предупреждения и был исключен из опции -Wall. |
|
|
|
|
|
DS51284H(ru) стр. 3-12 |
© 2008 Microchip Technology Inc. |