Время от времени я просматриваю текущую документацию по параметрам командной строки GCC / G ++ и обновляю свой скрипт компилятора, чтобы быть еще более параноидальным в отношении любых ошибок кодирования. Вот это , если вы заинтересованы.
К сожалению, я не документировал их, поэтому забыл больше всего, но -Pedantic, -Wall, -Wextra, -Weffc ++, -Wshadow, -Wonon-virtual-dtor, -Wold-style-cast, -Woverloaded-virtual, и некоторые другие всегда полезны, предупреждая меня о потенциально опасных ситуациях. Мне нравится этот аспект настраиваемости, он заставляет меня писать чистый, правильный код. Это послужило мне хорошо.
Однако они не без головной боли, особенно -Weffc ++. Всего несколько примеров:
- Требуется, чтобы я предоставил собственный конструктор копирования и оператор присваивания, если в моем классе есть члены-указатели, которые бесполезны, так как я использую сборщик мусора. Поэтому мне нужно объявить пустые частные версии их.
- Мой класс NonInstantiable (который предотвращает создание экземпляров любого подкласса) должен был реализовать фиктивный класс приватных друзей, чтобы G ++ не скулил о «только частных конструкторах и без друзей»
- Мой
Final<T>
класс (который предотвращает создание подкласса T, если T фактически получен из него) должен был обернуть T в закрытый класс-обертку, чтобы объявить его другом, так как стандартное выравнивание запрещает подружить параметр шаблона.
- G ++ распознает функции, которые никогда не возвращают возвращаемое значение, и вместо этого выдает исключение, и жалуется на то, что они не объявлены с атрибутом noreturn. Скрываться за всегда истинными инструкциями не получалось, G ++ был слишком умен и распознавал их. Мне потребовалось некоторое время, чтобы придумать объявление переменной volatile и сравнение ее с ее значением, чтобы можно было выбросить это исключение без изменений.
- Предупреждения сравнения с плавающей точкой. О Боже. Я должен обойти их, написав x <= y и x> = y вместо x == y, где это приемлемо.
- Затенение виртуалов. Хорошо, это явно полезно для предотвращения глупых проблем с тенями и перегрузками в подклассах, но все же раздражает.
- Нет предыдущего объявления для функций. Kinda потерял свою важность, как только я начал копировать объявление функции прямо над ним.
Это может звучать немного мазохистски, но в целом, это очень крутые функции, которые расширили мое понимание C ++ и общего программирования.
Какие еще интересные функции есть в G ++? Ну, это бесплатно, открыто, это один из наиболее широко используемых и современных компиляторов, постоянно превосходящий своих конкурентов, может съесть практически все, что люди к нему добавят, доступно практически на любой платформе, настраиваемо к черту, постоянно совершенствуется, имеет широкое сообщество - что не нравится?