Jump to content

    

Косяк у Кейла

А что Вы скажете о таком использовании void:

(void)argument;

Скажу "замечательно!"

#define GPIO_LOCK(PORT, BITS);            \
    GPIO##PORT->LCKR = 0x00010000 | BITS;    \
    GPIO##PORT->LCKR = 0x00000000 | BITS;    \
    GPIO##PORT->LCKR = 0x00010000 | BITS;    \
    (void)GPIO##PORT->LCKR;

 

Share this post


Link to post
Share on other sites
Скажу "замечательно!"

Могу в ответ сказать, что Вы не поняли к чему и вообще о чем был задан вопрос.

Share this post


Link to post
Share on other sites
Могу в ответ сказать, что Вы не поняли к чему и вообще о чем был задан вопрос.

Формально мой ответ соответствует вашему вопросу.

Конкретнее, "прочитать аргумент, но не использовать". Здесь главное прочитать.

Share this post


Link to post
Share on other sites
Формально мой ответ соответствует вашему вопросу.

Ну разве только формально, поскольку вырван из контекста.

Конкретнее, "прочитать аргумент, но не использовать". Здесь главное прочитать.

Для "прочитать" следует просто указать имя volatile переменной, коими являются (обязаны быть объявлены) и всякие железные регистры и никакого void в Вашем примере ни нафиг не нужно. Вот такие дела.

И вопрос был об аргументие переданном функции. Чего его читать-то? Вот он уже лежит, например, в регистре.

Share this post


Link to post
Share on other sites
Для "прочитать" следует просто указать имя volatile переменной, коими являются (обязаны быть объявлены) и всякие железные регистры и никакого void в Вашем примере ни нафиг не нужно. Вот такие дела.

Об аргументе функции - в этом участвовать не буду, не нахожу смысла.

О том, что написал. LCKR, естественно, volatile. И как же мне его обязательно прочитать? GPIOB->LCKR; и всё?

Share this post


Link to post
Share on other sites
Об аргументе функции - в этом участвовать не буду, не нахожу смысла.

Смысла в чем? В раборках с концептуальной "чиcтотой" использования void, или в самой конструкции? Сама конструкция ОЧЕНЬ полезна :) - пользуюсь постоянно.

О том, что написал. LCKR, естественно, volatile. И как же мне его обязательно прочитать? GPIOB->LCKR; и всё?

И все :)

Share this post


Link to post
Share on other sites
Смысла в чем? В раборках с концептуальной "чиcтотой" использования void, или в самой конструкции? Сама конструкция ОЧЕНЬ полезна :) - полюзуюсь постоянно.

Да, в разборках... не вижу смысла.

А когда пользуетесь "конструкцией"? Указатели обезличиваете? :rolleyes:

И все :)

Не пробовал. Проверю на досуге. Буду знать.

Я поначалу временную переменную заводил. Потом подсмотрел здесь на форуме (void), стал применять, довольный. А оно вона как, оказывается.

Share this post


Link to post
Share on other sites
Не пробовал. Проверю на досуге. Буду знать.

Приведение к void - это просто способ явно указать, что результат чтения переменной отбрасывается. Для улучшения читаемости кода и/или подавления возможных предупреждений компилятора.

Как-то даже натыкался на статейку, в которой авторы изучали разные языковые конструкции для чтения переменной и отбрасывания результата. Изучали с точки зрения совместимости с разными компиляторами. Надо сказать, протестированные компиляторы выступили хреново. Стандарт языка не оставляет сомнений (как мне кажется), что достаточно написать выражение, состоящее только из имени переменной. Далеко не все компиляторы были согласны. Но это было давно, может быть, с тех пор стало получше.

Share this post


Link to post
Share on other sites
А когда пользуетесь "конструкцией"? Указатели обезличиваете? :rolleyes:

Расстроили Вы меня :(.

Это игнорирование неиспользуемых аргументов.

А оно вона как, оказывается.

Ага :).

Share this post


Link to post
Share on other sites

Хорошо, а если бы LCKR не был volatile, какая разница? Задано "прочитать", пусть читает. При оптимизации такой оператор может быть выброшен, понятно. А без оптимизации, значит, прочитается?

 

Это игнорирование неиспользуемых переменных.

Что это означает?

Share this post


Link to post
Share on other sites
Далеко не все компиляторы были согласны.

Уточните, с чем это они "не согласны"? Просто имя НЕ volatile перемеменной, это ее чтение, что есть бессмысленная операция, предупреждение и выкидывание оптимизатором, если умеет. Два других помянутых варианта совершенно однозначны.

 

 

 

 

Что это означает?

Описка - аргументов.

 

Share this post


Link to post
Share on other sites

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

 

То что нельзя оптимизировать цикл while(temp) при том что temp объявлен volatile, это скорее следствие. То есть я хочу подчеркнуть что volatile - это не запрет на оптимизацию переменный, а указание использовать ее значение из памяти, и уточнять его каждый раз когда переменная нужна.

 

Однако из этого не следует что встретив в тексте

temp;

мы обязательно должны его прочитать, если a=temp; то да, должны прочитать значение из памяти и пихнуть его в а, просто потому что мы указали что temp должен всегда уточняться, но если он не используется, то и читать его не надо. Так что понять компиляторы и их авторов которые такие строчки пропускали в целом можно.

 

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

 

Это игнорирование неиспользуемых аргументов.

если это было не понятно, то

Описка - аргументов.

прям стало супер понятно%)....

 

пример бы привели, а не 3 поста вокруг одного и того же...

 

 

Share this post


Link to post
Share on other sites
Вам просто следовало-бы наконец понять, что "do-while-zero" является сама по себе ненужным трюком и еще в каких-то "эквивалентах" не нуждается.

...

Согласен, конструкция не нужна при одном или нескольких нижеследующих случаях.

 

1) Если в работе используется только один компилятор. (IAR к примеру)

2) Если в работе используется только одна архитектура. (ARM к примеру)

3) Если в работе участвует только один человек. (С высокой культурой программирования)

4) Если в работе не требуется следовать стандартам индустрии. (MISRA C к примеру)

5) Если в работе не требуется использовать макросы-как-функции. (Для целей отладки, например)

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

7) Если в работе принято не признавать своих заблуждений.

Share this post


Link to post
Share on other sites
Я всегда делаю пустую переменную, причем присваиваю ее саму себе чтобы не было варнинга что она не использована, и читаю в нее явным образом, сопровождая вссе комменатрием. Так код гораздо понятнее, но это мое личное мнение.

Такие теледвижения свидетельствуют только о незнании и неуверености :(. Типа постучать в бубен, поставить свечку :(

Причем они все бесполезны, ибо описаные действия БЕССМЫСЛЕННЫ и ВЫКИДЫВАЮТСЯ компилятором. Проделайте все эти бессмысленые телодвижения с НЕ volatile переменой и получите пшик :(.

Вот и поучается, что необходимо и достаточно только упоминания имени volatile переменной.

 

 

 

Согласен, конструкция не нужна при одном или нескольких нижеследующих случаях.

Все мимо.

 

 

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

Удивился. Проверил.

void dummy();
void dummy()
{
}

 

На

void dummy();

не ругается. Но, зато и за прототип его НЕ признает и на функцию

void dummy()

{

}

ругается:

Error[Pa045]: function "dummy" has no prototype

 

Вывод - косяк в IAR :(, который вместо выругаться на КРИВОЙ прототип по месту его объявления, ругается на то, что отсутствует протоип по месту функции.

 

GCC тут поступает чуть более корректно, СРАЗУ говорит, что фигня это (в смысле вызов функции), а не прототип:

warning: function declaration isn't a prototype [-Wstrict-prototypes]

 

P.S.

Ну и раз уж добрался до компилятора, специально для Golikov A.

     46          void dummy( void )
     47          {
     48          int x = b;
     49          x = x;
     50          
     51          }
   \                     dummy:
   \   00000000   0xE12FFF1E         BX       LR            ;; return

Тот самый "пшик" оставшийся от всех ненужных телодвижений.

А вот без глупостей, но с volatile:

     47          void dummy( void )
     48          {
     49              b;
   \                     dummy:
   \   00000000   0x........         LDR      R0,??DataTable20
   \   00000004   0xE5900000         LDR      R0,[R0, #+0]
     50          }
   \   00000008   0xE12FFF1E         BX       LR            ;; return

Share this post


Link to post
Share on other sites
Уточните, с чем это они "не согласны"?

Дык ради чего весь сыр-бор? Прочитать volatile-переменную. Вот просто не читали (если заглянуть в ассемблерный листинг).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this