У меня есть следующая строка кода:
ftDCB.ByteSize = FT_BITS_8;
И lint (PC-lint через Visual Lint, в частности) дает мне сообщение 1924 года («Приведение в стиле C — более эффективный C ++ # 2»).
FT_BITS_8 # определен в стороннем заголовочном файле, и вот где приведено приведение:
#define FT_BITS_8 (UCHAR) 8
И UCHAR — это typedef из заголовочного файла другого стороннего производителя:
typedef unsigned char UCHAR;
Назначение (ftDCB.ByteSize) — это BYTE, который также является typedef для неподписанного символа:
typedef unsigned char BYTE;
Я действительно не хочу изменять сторонние заголовки, поэтому я попытался скрыть сообщение в моем коде:
//lint -e(1924) C-style cast
ftDCB.ByteSize = FT_BITS_8;
Но я получаю то же сообщение 1924 года.
Что я здесь не так делаю? И есть ли более чистый способ сделать то, что я хочу сделать (кроме изменения стороннего заголовка)?
Хорошо, отвечая на мой собственный вопрос, похоже, работает следующее:
ftDCB.ByteSize = /*lint -e(1924) C-style cast */ FT_BITS_8;
У меня просто была такая же проблема, и я нашел более хороший способ исправить это (помните, что читаемость кода является основным аспектом качества кода, и если он напичкан комментариями ворсинок, это довольно уродливо).
Поэтому, если вам предоставляется заголовок, который вы не можете изменить (например, определения периферийных устройств в микроконтроллерах), вы должны включить их таким образом, чтобы PC-lint знал, что это заголовок библиотеки. Есть несколько способов, самый простой — использовать угловые скобки.
Так что вместо:
#include "peripheral.h"
Использование:
#include <peripheral.h>
Это скажет PC-lint рассматривать файл как заголовок библиотеки, что дает вам более точный контроль над сообщениями с помощью -elib
и это братья.
Если ваши сообщения основаны на макросе, -elibmacro
предоставляет хорошую возможность:
//lint -save
//lint -elibmacro(1924)
#include <peripheral.h>
//lint +elibmacro(1924)
//lint -restore
Это заблокирует сообщение 1924 от всех макросов, определенных в peripheral.h
и включает в себя оттуда.
-save
а также -restore
вероятно, излишни, но это моя привычка, так как я часто сталкиваюсь с неприятностями, когда отключаюсь слишком много в одной точке и больше не получаю никаких сообщений.
Обратите внимание, что все заголовки включены в peripheral.h
теперь будут рассматриваться как заголовки библиотек, но вы обычно этого хотите.
Вы можете прочитать главу 6 руководства по PC-lint, касающуюся библиотек.
Поскольку FT_BITS_8 является макросом, -esym(1924,FT_BITS_8)
в вашем файле std.lnt также будут удалены все случаи этой проблемы.