Есть два кода, которые включают gprs shield: Код (Text): void setup() { pinMode(9,OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(3000); } void loop() { } В одном из них включение шилда прописано просто в setup(), а в другом для этого отведена отдельная процедура, которая аналогично выполняется в setup(). В первом случае все работает, во втором никаких действий не происходит. Код (Text): void gprs_power() { pinMode(9,OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(3000); } void setup() { gprs_power; } void loop() { } В чем может быть проблема? Ведь с точки зрения компилятора код получается один и тот же?
Поясню почему это скомпилировалось. Представьте себе код: Код (Text): int x = 42; x; В C++ просто `x` — это допустимое выражение. В данном случае вторая строка — просто получение значения 42. Ну да, ничего мы с ним не делаем, просто 42 и всё тут. Но и функции в C++ являются полноценными rvalues (т.е. могут участвовать в выражениях справа от знака =, т.е. участвовать в вычислениях). Упоминание имени функции — это получение её адреса. Поэтому: Код (Text): void foo() {} void setup() { foo; foo(); } в первом случае означает получение указателя на `foo`. Ну да, 0x0badbeef, ничего с ним не делаем, это нормально. А вот во втором случае, когда пишем () мы говорим, что хотим вызвать функцию, лежащую по адресу `foo`. В простонародии: вызываем функцию foo.