Arhn - архитектура программирования

C ++: Какие параметры GNU G ++?

Возможный дубликат:
Лучший уровень предупреждения компилятора для Компиляторы C / C ++?

В GCC есть тысячи опций для добавления предупреждений; Я надеялся, что -Wall -Wextra -pedantic включил все полезные, но только сейчас я встретил -Woverloaded-virtual, который мне очень понравился.

Какие еще параметры G ++ вы используете или порекомендуете?

11.01.2011


Ответы:


1

Не совсем из той же категории, но я всегда компилирую с -Werror, чтобы отмечать предупреждения как ошибки. Очень полезно.

Чтобы это работало со сторонними заголовками, я включаю эти заголовки через -isystem вместо -I… иначе предупреждения в этих заголовках нарушат сборку.

Также есть -Weffc++, который предупреждает о конкретных проблемах, описанных в Эффективном C ++ Мейерса. Однако я нашел это слишком резким. Например, он предупреждает о базовых классах, которые не объявляют виртуальные деструкторы. Теоретически это очень хорошо, но я работаю над библиотекой шаблонов, которая использует наследование для повторного использования кода (и классов политик), и, очевидно, у них нет (и не требуется) виртуальных деструкторов.

11.01.2011
  • Я согласен, что -Weffc++ слишком суров. Однако время от времени я компилирую с ним, чтобы проверить свой код. 12.01.2011
  • По иронии судьбы -Weffc++ предупреждает о наследовании от класса политики boost::noncopyable, но наследование от такого класса рекомендуется в Effective C ++. Точно так же предупреждает о наследовании std::unary_function и друзей. GCC здесь должен быть немного умнее: класс без членов-данных и без общедоступных функций-членов вряд ли будет использоваться полиморфно. 12.01.2011
  • @Philipp: Проблемы известны, и в списке рассылки GCC есть несколько зарегистрированных ошибок и обсуждений по этому поводу ... Однако я не думаю, что это скоро будет исправлено. 12.01.2011

  • 2

    См. Лучший уровень предупреждений компилятора для компиляторов C / C ++?. Один пост содержит следующий исчерпывающий (и исчерпывающий) список.

       -g -O -Wall -Weffc++ -pedantic  \
        -pedantic-errors -Wextra  -Wall -Waggregate-return -Wcast-align \
        -Wcast-qual  -Wchar-subscripts  -Wcomment -Wconversion \
        -Wdisabled-optimization \
        -Werror -Wfloat-equal  -Wformat  -Wformat=2 \
        -Wformat-nonliteral -Wformat-security  \
        -Wformat-y2k \
        -Wimplicit  -Wimport  -Winit-self  -Winline \
        -Winvalid-pch   \
        -Wunsafe-loop-optimizations  -Wlong-long -Wmissing-braces \
        -Wmissing-field-initializers -Wmissing-format-attribute   \
        -Wmissing-include-dirs -Wmissing-noreturn \
        -Wpacked  -Wpadded -Wparentheses  -Wpointer-arith \
        -Wredundant-decls -Wreturn-type \
        -Wsequence-point  -Wshadow -Wsign-compare  -Wstack-protector \
        -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch  -Wswitch-default \
        -Wswitch-enum -Wtrigraphs  -Wuninitialized \
        -Wunknown-pragmas  -Wunreachable-code -Wunused \
        -Wunused-function  -Wunused-label  -Wunused-parameter \
        -Wunused-value  -Wunused-variable  -Wvariadic-macros \
        -Wvolatile-register-var  -Wwrite-strings
    
    11.01.2011
  • Некоторые из них избыточны. Например, второй -Wall и -Wcomment подразумеваются первым -Wall. -Werror + -pedantic означает -pedantic-errors. 12.01.2011
  • Верно. В любом случае это перебор. Но это хорошая отправная точка. 12.01.2011

  • 3

    Некоторые из тех, что я видел, используются;

    -Wcast-qual: предупреждать каждый раз при приведении указателя, чтобы удалить квалификатор типа из целевого типа. Например, предупредить, если const char * приведен к обычному char *.

    -Wpointer-arith: предупреждать обо всем, что зависит от размера типа функции или void. GNU C присваивает этим типам размер 1 для удобства вычислений с void * указателями и указателями на функции.

    -Wwrite-strings: при компиляции C присвойте строковым константам тип const char[length], чтобы при копировании адреса одной в указатель, отличный от const char *, появлялось предупреждение; при компиляции C ++ предупредить об устаревшем преобразовании строковых литералов в char *. Это предупреждение по умолчанию включено для программ на C ++. Эти предупреждения помогут вам найти во время компиляции код, который может попытаться записать в строковую константу, но только если вы очень осторожно использовали const в объявлениях и прототипах. Иначе будет просто неприятность; вот почему мы не заставили -Wall запрашивать эти предупреждения.

    -Wdisabled-optimization: предупреждать, если запрошенный проход оптимизации отключен. Это предупреждение обычно не означает, что с вашим кодом что-то не так; это просто указывает на то, что оптимизаторы GCC не смогли эффективно обработать код. Часто проблема в том, что ваш код слишком большой или слишком сложный; GCC откажется от оптимизации программ, если сама оптимизация может занять чрезмерно много времени.

    11.01.2011

    4

    Обычно я включаю все предупреждения, а затем выборочно удаляю те флаги, которые дают бесполезные результаты. В одном из своих проектов я использую следующие предупреждения C и C ++:

    -pedantic
    -Wall
    -Wextra
    -Wformat=2
    -Wmissing-include-dirs
    -Wswitch-default
    -Wswitch-enum
    -Wunused
    -Wstrict-aliasing=1
    -Wfloat-equal
    -Wundef
    -Wunsafe-loop-optimizations
    -Wpointer-arith
    -Wcast-qual
    -Wcast-align
    -Wwrite-strings
    -Wconversion
    -Wmissing-format-attribute
    -Wpacked
    -Wredundant-decls
    -Winvalid-pch
    -Wvolatile-register-var
    -Wsync-nand
    -Wsign-conversion
    -Wlogical-op
    -Wmissing-declarations
    -Wmissing-noreturn
    -Wstrict-overflow=5
    -Wstack-protector
    

    Кроме того, я использую следующие флаги C ++:

    -std=c++98
    -Wnon-virtual-dtor
    -Wctor-dtor-privacy
    -Wstrict-null-sentinel
    -Woverloaded-virtual
    -Wsign-promo
    

    Кроме того, для релизной сборки я включаю следующие предупреждения:

    -pedantic-errors
    -Werror
    -Wuninitialized
    -Winit-self
    -Wdisabled-optimization
    

    Меня очень раздражает, что -Wall включает только абсолютный минимум предупреждений вместо «всех», как следует из названия.

    11.01.2011
  • Я бы подумал, что -Wdisabled-optimization -Werror немного смелее в режиме выпуска. Отклоняйте любой код, который не подходит для всех оптимизаций. Или это уловка для принудительного выполнения небольших функций? ;-) 12.01.2011
  • @ Стив Джессоп: Для этого проекта (который очень мал) он работает, но для других проектов я бы отключил этот флаг, если он вызывал предупреждения. Кроме того, -Wswitch-enum может сильно раздражать при работе с большими перечислениями. 12.01.2011

  • 5

    В дополнение к уже упомянутым выше:

    -pedantic                   Issue warnings needed for strict compliance to the standard
    -Wall
    -Wextra                     Print extra (possibly unwanted) warnings
    -Werror                     Treat all warnings as errors
    -std=c++0x                  Conform to the ISO 1998 C++ standard, with extensions that are likely to be in C++0x 
    -std=c++98                  Conform to the ISO 1998 C++ standard  
    
    11.01.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..