Несколько моментов требуют уточнения. Например, строка:
#if !WIN32
на самом деле хорошо определено стандартом и может быть разумно использовано
если ваши вызовы компилятора всегда содержат /DWIN32=1
или -DWIN32=0
.
В этом отношении стандарт говорит, что символы, которые не определены,
заменяется на 0
при расширении макроса, поэтому проблем не возникает
с линией , если в некоторых других соглашениях не указано, что символ
будет определяться только на машинах Windows, но значение, которое оно определено для
не указано; в этом случае вам нужно что-то вроде:
#ifndef WIN32
В конце концов, это зависит от соглашений, которые вы установили для
обработка зависимостей компилятора.
С другой стороны, следует избегать строки, которая следует сразу за
так как он определяет символ (ULONG_MAX
), который определен в C и
Стандарты С ++. Последовательность из трех строк здесь должна быть заменена на:
#include <limits.h>
Что касается второго вопроса, я не уверен, что ошибка не
неправильное толкование правила MISRA. В C ++ const
подразумевает внутренний
связь по умолчанию: определение символа в заголовке вызовет
несколько экземпляров переменной (с другим адресом в
каждая единица перевода), но не вызовет проблем с несколькими
определения. И альтернативы также имеют свои недостатки. мой
предпочтение здесь будет состоять в том, чтобы заменить определение переменной
макрос:
#define CompanyName "mycompany"
но у макросов есть свои проблемы. Объявление символа extern
, и
затем определение его в одном (и только одном) исходном файле является другим
альтернатива, но это включает в себя два утверждения, в двух разных файлах,
где (в зависимости от роли, которую играет переменная), можно
предпочтительнее. (Судя по названию, я не думаю, что два заявления
было бы проблемой, но есть и другие случаи, когда предпочтительнее
оставьте текст видимым в заголовке.) Оставьте его, как вы написали
также является жизнеспособной альтернативой, если ваша компания не имеет строгих правил
против этого.
Что касается последней точки, выражение 0
имеет тип int
, который
подписано Можно четко указать тип 0UL
, но, честно говоря, этот
не должно быть необходимо: 0
равно 0
, независимо от типа, и в то время как
могут быть случаи, когда вы хотите форсировать тип, чтобы
арифметика происходит определенным образом, это не один из них. Что касается
ошибка / предупреждение, я подозреваю, что это также неверное толкование
правила MISRA; неявные преобразования, которые изменяют подпись, могут быть
проблематично, но не тогда, когда то, что превращается, очень мало
неотрицательное постоянное целое число. Так что пишите 0UL
если вам нужно придерживаться
к правилам компании, но понимаете, что это
точка глупости: случай в основном здравого правила, применяемого в
случаи, когда это не актуально.