GCC скрытые / малоизвестные функции - PullRequest
7 голосов
/ 18 февраля 2011

Это моя попытка начать сборку специальных функций GCC, которые обычно не встречаются. это происходит после @jlebedev в другом вопросе, упоминаемом «Эффективный C ++» для g ++,

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

Какие еще интересные функции есть?

Ответы [ 2 ]

5 голосов
/ 01 июля 2011

Время от времени я просматриваю текущую документацию по параметрам командной строки 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 ++? Ну, это бесплатно, открыто, это один из наиболее широко используемых и современных компиляторов, постоянно превосходящий своих конкурентов, может съесть практически все, что люди к нему добавят, доступно практически на любой платформе, настраиваемо к черту, постоянно совершенствуется, имеет широкое сообщество - что не нравится?

1 голос
/ 01 июня 2011

Функция, которая возвращает значение (например, int), будет возвращать случайное значение, если следовать кодовому пути, который завершает функцию без оператора «return value». Невнимание к этому может привести к исключениям и записи или чтению из памяти вне диапазона.

Например, если функция используется для получения индекса в массиве, и используется неверный путь кода (тот, который не заканчивается оператором return 'value'), тогда будет возвращено случайное значение, которое может быть слишком большим, как индекс в массиве, приводя к разного рода головным болям при неправильном использовании стека или кучи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...