Управление Предупреждениями Clang
я скомпилировал источник объединения SQLite в свой проект iOS и clang
бросает предупреждение на этой строке
mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff;
со следующим предупреждением:
Implicit conversion from 'long long' to 'long' changes value from
9223372036854775807 to -1
[warn_impcast_integer_precision_constant]
Я включен -fdiagnostics-show-name
показать имя (warn_impcast_integer_precision_constant
).
Я, конечно, не хочу ничего менять в источнике SQLite, так как я не хочу вводить непредвиденные побочные эффекты, поэтому я хотел бы отключить это конкретное предупреждение только для этой одной строки. Предупреждение, конечно, справедливо, но не может произойти в любом случае с sizeof
проверить на месте.
чтобы сделать этот процесс воспроизводимым для других предупреждений и диагностики, есть ли способ узнать конкретный класс предупреждений и отключить их для одной строки? К сожалению, я не могу найти ничего в так называемом clang/llvm
"документация".
3 ответов
любая удаленная последняя версия clang должна печатать флаг, связанный с данным предупреждением вместе с предупреждением (в этом случае-wconstant-conversion); не уверен, почему вы этого не видите. И чтобы отключить его, вы можете использовать #pragma clang diagnostic ignored "-Wconstant-conversion"
.
цитата из инструкции выложены сэром Крисом Lattner:
в приведенном ниже примере-Wmultichar игнорируется только для одной строки кода, после чего диагностика возвращается в то состояние, которое ранее существовало.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
char b = 'df'; // no warning.
#pragma clang diagnostic pop
но что более важно, не было бы более разумным рассмотреть тип переменной, которая является "маской", и что представляет собой "Маска"?
поскольку вы делаете что-то в зависимости от того, является ли размер long 8, должен ли он может быть типа uint64_t?
что, если sizeof (long) на самом деле 16 вместо 8 или 4 (что, я думаю, вы ожидаете, когда это не 8)? Может быть 0x7fffffff тогда еще маску вам нужно? Или, возможно, вы действительно хотите назначить LONG_MAX из пределов.h а не нынешняя конструкция.
руководство пользователя clang здесь: http://clang.llvm.org/docs/UsersManual.html
в нем обсуждаются различные темы, связанные с диагностикой. Есть другие полезные документы в боковой панелиhttp://clang.llvm.org/