Является ли этот вызов функции «delay + (1000)» синтаксически правильным? - PullRequest
3 голосов
/ 09 июня 2019

Я пишу небольшой код для включения зуммера, когда показания датчика превышают определенный порог.Чтобы включить зуммер на одну секунду, я дал задержку в 1000 мс, вызвав эту функцию: delay(1000).Тем не менее, я случайно набрал delay+(1000), и он хорошо компилируется.Является ли этот вызов функции синтаксически правильным?

Я пробовал этот код в Arduino IDE.Он компилируется, но то же самое не относится к avr-gcc или avr-g ++ или gcc / g ++.

Я ожидаю, что delay + (1000) не скомпилируется, так как это не соответствует действительному синтаксису c / c ++.

Обновление 1:

Скомпилирован и загружен следующий фрагмент кода в Arduino UNO с использованием IDE Arduino:

void setup() 
{
    Serial.begin(9600);
}

void loop()
{
    int x = delay+(1000);
    Serial.println(x);
}

Он непрерывно печатает случайное число 1132без каких-либо задержек.(Итак, 1132 => Адрес указателя функции + 100?)

Я также заметил, что delay+(1000) и delay-(1000) компилируются, но то же самое не верно для delay*(1000) и delay/(1000).Компилятор выдает следующую ошибку:

sketch_jun09a: 8: ошибка: недопустимые операнды типов 'void (long unsigned int)' и> 'int' для двоичного оператора '*'

     delay*(1000);
               ^

Однако, это int t = (int)delay*(1000); хорошо компилируется.

Обновление 2:

На основании приведенных ниже ответов, delay<operator>(x) просто выполняет указатель на функциюарифметический (с использованием унарных или бинарных операторов) и не выполняет саму функцию.

Я использовал следующий фрагмент кода:

void setup()
{
    Serial.begin(9600);
}
int custom()
{
    Serial.println("hello");
    return 0;
}
void loop()
{
    custom+(1000);
    delay+(1000);
}

Он хорошо компилируется и ничего не выводит.

Обновление 3:

Я изменил уровень предупреждений компилятора на «ВСЕ» в «Настройках» в Arduino IDE.При компиляции этого фрагмента,

void setup() 
{
    delay+(1000);
}
void loop() {}

Получаются следующие предупреждения:

sketch_jun09a.ino: В функции 'void setup ()': sketch_jun09a.ino: 3: 14:предупреждение: указатель на функцию, используемую в арифметике [-Wpointer-arith]

  delay+(1000);
             ^

sketch_jun09a.ino: 3: 8: предупреждение: инструкция не оказывает влияния [-Wunused-value]

  delay+(1000);
       ^

Ответы [ 3 ]

7 голосов
/ 09 июня 2019

Итак, здесь происходит две вещи.

delay+(1000)

- это синтаксис для добавления 1000 к задержке указателя функции.Что, конечно, совершенно бессмысленно, но зачем оно вообще компилируется.Обычно вы можете добавлять целые числа к указателям, но это не относится к void * указателям и указателям на функции.gcc, однако, имеет расширение, которое позволяет добавлять к void * и void(*)() работу, давая типы void и void() size 1. Таким образом, добавление целых чисел к функциям работает (бесполезно).

Оказывается, что добавление целых чисел к указателям void * иногда является чем-то, что вы действительно хотите сделать, и расширение избавляет от нескольких раздражающих дополнительных локальных переменных, но указатели на функции почти никогда не работают так.Я предполагаю, что кто-то создавал код asm некоторое время назад, поскольку это единственный вариант использования, который я могу себе представить.Подсказка: на некоторых архитектурах указатели на функции указывают не на код функции, а на дескрипторы.

2 голосов
/ 09 июня 2019

Я думаю, это добавляет 1000 к function pointer, переменной , константе или расширению макроса из delay, но выражение delay+(1000) мало что делает для сам ...

0 голосов
/ 11 июня 2019

Посмотрите на ответ Джошуа, почему.Это отличный ответ.Что касается того, что делать , вам нужно на самом деле позвонить delay.

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);
    Serial.println("Hi there");
}
...