Как мне обратиться к предупреждениям при компиляции SQLite с VC ++? - PullRequest
1 голос
/ 15 февраля 2010

Всякий раз, когда я компилирую SQLite с помощью Visual C ++ 9, я получаю сотни предупреждений, например

  • потенциально неинициализированные переменные
  • преобразование из более широких целочисленных типов в более узкие целочисленные типы
  • несовпадение целых чисел со знаком / без знака.

Я не одинок - есть вопрос по SQLite FAQ специально об этом. Ответ на этот вопрос говорит о том, что

  • эти предупреждения не появляются в GCC, которые используют разработчики SQLite
  • Предупреждения не являются проблемой, так как команда тщательно тестирует код

Конечно, я не могу спорить с этими пунктами, но ...

  • Я не использую GCC - я использую VC ++, а VC ++ показывает предупреждения
  • они протестировали код, скомпилированный с GCC, и я не использую GCC, поэтому могут быть некоторые различия, определенные реализацией, или что-то вроде разных уровней соответствия стандартам C между GCC и VC ++, которые будут тонко нарушать код с серьезными последствиями.

Вот почему мне не нравится идея просто игнорировать все предупреждения.

Итак, как мне поступить с предупреждениями, которые выводит VC ++ при компиляции SQLite?

Ответы [ 6 ]

1 голос
/ 15 февраля 2010

Почему бы не использовать #pragmas, чтобы отключить эти предупреждения, если они на самом деле не причиняют вреда? Или переключитесь на более низкий уровень предупреждения (как я полагаю, у вас есть источник SQLite как отдельный проект VC lib?)

0 голосов
/ 16 февраля 2010

Что в основном означают эти предупреждения, так это:

  1. Если вы перенесете код в среду, в которой все базовые типы (char, short, int, long, long long) точно такого же размера, что и исходные разработчики, которые использовали и тестировали, код, вероятно, будет работать как проверено (хотя не забывайте об этих, возможно, неинициализированных переменных), но

  2. Если вы когда-нибудь портируете код в среду, в которой некоторые из базовых типов отличаются по размеру от того, что использовали первоначальные разработчики, у вас есть хорошие шансы взломать код загадочными и нелогичными способами на некоторых из тех мест, где вы получаете эти предупреждения. Это может быть правдой, даже если вы используете GCC в обеих средах. См. C FAQ 3.19 с некоторыми примерами поведения, которое может произойти (помните, что стандарты C и C ++ теперь предписывают правила «сохранения стоимости»).

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

0 голосов
/ 15 февраля 2010

Выберите файлы в обозревателе решений VC9, щелкните правой кнопкой мыши и выберите «Свойства». Затем перейдите на вкладку C++ -> General и установите Warning level на Off. Это отключит все предупреждения только для этих файлов.

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

0 голосов
/ 15 февраля 2010

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

Если код работает, количество отправленных предупреждений в значительной степени не имеет значения.

Если вы хотите быть осторожнее, посмотрите на предупреждения: связано ли какое-либо из них с поведением, определяемым реализацией, которое по-разному обрабатывается VS и GCC? Если это так, у вас могут быть проблемы. Но пока предупреждения касаются вещей, которые обрабатываются одинаково обоими компиляторами (например, целочисленные / двойные преобразования), их можно игнорировать.

Насколько я помню (некоторое время назад я компилировал SQLite для VS без предупреждений о глушении), практически все предупреждения касаются неявных преобразований между встроенными типами, которые абсолютно безопасны, если разработчик знает происходит.

SQLite прекрасно работает на VS, хотя. Библиотека широко используется многими крупными проектами. Это проверено довольно широко.

0 голосов
/ 15 февраля 2010

Я бы сказал, что компиляция чего-то столь сложного, как SQLite, с использованием компилятора и библиотек, которые сами разработчики говорят, что они никогда не используют, обречена на неудачу или, по крайней мере, будет очень, очень болезненной. GCC легко установить и использовать в Windows (получите его по адресу http://tdragon.net/recentgcc),, так почему бы не использовать его?

0 голосов
/ 15 февраля 2010

Как любой разработчик, работающий с C ++, справляется с предупреждениями? Изучите код, о котором вы получаете предупреждение, определите, говорит ли предупреждение то, что вам нужно знать, а затем измените код, если это необходимо. Я не уверен, что действительно понимаю ваш вопрос.

Возможно, если вы разместили конкретное предупреждение (с кодом), мы могли бы посоветовать вам, что вам с этим делать.

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