Перейти к содержанию
    

А что Вы скажете о таком использовании 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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

И все :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

И все :)

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Ага :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далеко не все компиляторы были согласны.

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

 

 

 

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

temp;

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

 

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

 

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

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

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

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

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

 

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Причем они все бесполезны, ибо описаные действия БЕССМЫСЛЕННЫ и ВЫКИДЫВАЮТСЯ компилятором. Проделайте все эти бессмысленые телодвижения с НЕ 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уточните, с чем это они "не согласны"?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...