C ++ g ++ -pedanti c предупреждение - PullRequest
0 голосов
/ 03 мая 2020

Я изучаю книгу Бьярна Страуструпа «Принципы и практика программирования с использованием C ++». Я скачал его заголовочный файл из здесь и использовал следующую команду компиляции в VSCode на Windows:

g++ -Wall -Wextra -Wconversion -pedantic -std=c++17 -g -c main.c

Компилятор вывел кучу ошибок:

std_lib_facilities.h: In member function 'char& String::operator[](unsigned int)':
std_lib_facilities.h:114:8: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
   if (i<0||size()<=i) throw Range_error(i);
       ~^~
std_lib_facilities.h: In member function 'const char& String::operator[](unsigned int) const':
std_lib_facilities.h:120:8: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
   if (i<0||size()<=i) throw Range_error(i);
       ~^~
std_lib_facilities.h: At global scope:
std_lib_facilities.h:222:2: warning: extra ';' [-Wpedantic]
 };

Мои вопросы:

  1. Правильно ли удалить точку с запятой в строке 222? Код в вопросе:
default_random_engine& get_rand()
{
    static default_random_engine ran;
    return ran;
};
Какое возможное исправление для unsigned expression < 0 is always false? Чего следует ожидать в будущем при использовании g ++ (mingw64)? Если возможно, какие ресурсы можно узнать, как эффективно использовать компилятор g ++?

Код, который нужно скомпилировать, представлял собой простой привет мир. Спасибо

1 Ответ

1 голос
/ 03 мая 2020

1.

Эта точка с запятой избыточна. Это обязательно только после закрывающей скобки} определения класса, структуры, перечисления или объединения.

2.

Как говорится в сообщении об ошибке, тип unsigned никогда не может иметь отрицательное значение так что тестирование if (i<0) бесполезно. Компилятор предупреждает, потому что такой бесполезный тест является индикатором вероятной ошибки где-то в коде. Как вы это исправите, сказать сложно. Либо сравнение является избыточным и может быть удалено; или i не должен быть беззнаковым типом и должен быть изменен. В конце концов это выбор дизайна.

3.

С вашими текущими настройками предупреждений вы уже широко используете безопасность net, предоставляемую компилятором. Это хорошо. Теперь установите привычку проверять эти предупреждения и исправлять их. Ваша цель должна быть чистой компиляцией без каких-либо предупреждений. Особенно во время тяжелого развития, вы не всегда можете этого достичь. Но держите время, когда вы делайте как можно более короткими предупреждениями.

Чем меньше умственных способностей вам нужно использовать, чтобы избежать глупых ошибок, тем больше у вас остается логи c вас Реализуем. Приложив немного практики, на удивление быстро можно добраться до этапа «если он компилируется, он работает» (большую часть времени).

В понимании G CC я бы не стал go выходить за пределы настроек предупреждений сейчас. В любом случае, вы не хотите вызывать g ++ напрямую для чего-то еще, кроме примеров hello world. Для более сложных проектов вам нужна система сборки, которая выполняет всю оркестровку и настройку за вас. В мире C ++ это означает CMake. Хороший обзор существующих практик: Effective Modern CMake . Особенно посмотрите видео в разделе Getting Started .

...