2016-12-21 12 views
1

Из концепции Cvalue, я понял, чтоВ MISRA C++ 2008, кто-нибудь знает, что выражение выражения Cvalue специализировано в правиле 5-0-3?

«Выражение, которое не должно подвергаться дальнейшему преобразованию, явно или неявно, называется выражением cvalue.»

Но с примером, представленным этим правилом.

s32 = static_cast <int32_t> (s8) + s8; // Example 2 - Compliant 
s32 = s32 + s8; // Example 3 - Compliant 

Очевидно, что правильные выражения сложения происходят неявно и явно конверсиями здесь. И это правило означает их соответствие требованиям. Я думаю, что это противоречит понятию.

+1

Можете вы объяснить или включить ссылку на определение «cvalue» для тех из нас, кто не знаком с MISRA? – Brian

+0

Yeap, как и то, что я сказал, определение «cvalue» - это выражение, которое не должно подвергаться дальнейшим преобразованиям, неявным или явным образом, называется выражением cvalue. '[Misra 2008 compliance] (https: // bpb .opendns.com/а/www.ldra.com/attachments/article/74/MISRA-CPP_2008_COMPLIANCE.pdf? reg = short) –

ответ

2

В конце страницы 57, MISRA Cpp 2008:

Похоже, если не указано ниже:

  • . , ,

  • Остальные неуказанные выражения не являются cvalues ​​ и имеют базовый тип операции.

Чтения длинного списка после этого пункта, ничто не может быть применено к s8.

Затем s8 не cvalues ​​, он имеет базовый тип операции, в вашем примере, его базовый тип является int32_t. Продвижение до int32_t не нарушает правило.

Весь смысл 5-0-3 заключается в том, что он хочет, чтобы все операции выполнялись в одном и том же базовом типе.

int32_t s32; 
int8_t s8; 
s32 = static_cast <int32_t> (s8) + s8; // Example 2 - Compliant 
s32 = s32 + s8; // Example 3 - Compliant 

В этих примерах выше, + выполняются с основным типом int32_t (к настоящему времени, большинство из int является int32_t или int16_t), возвращает базовый тип int32_t, а затем присвоить к int32_t переменным, таким образом, совместимый с MISRA Cpp.

В этом примере:

int32_t s32; 
int8_t s8; 
s32 = s8 + s8; 

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

+0

Фактически в C++ 'signed char x = 127, y = 127; int z = x + y; 'отлично определено, чтобы в z реализациях было 254 в любой реализации. – 6502

+0

Я согласен с тобой. Та же цитата с вами: В конце страницы 57, MISRA Cpp 2008: «Двоичные выражения не являются значениями, а их базовый тип является результатом применения базовых типов преобразований». Здесь он говорит, что двоичные выражения не являются значениями, является ли это конфликтует с s32 = static_cast < int32_t > (s8) + s8; // Пример 2 - Соответствие'.
И если я меняю код следующим образом: 's32 = (int32_t) (s8 + s8);' Должен ли он быть несоответствующим. –

+0

Он указан ниже в аддитивном разделе – Danh

 Смежные вопросы

  • Нет связанных вопросов^_^