Инициализация объекта как члена класса приводит к ошибке связывания?

Я немного ошеломлен тем, почему это не работает. Я продолжаю получать следующую ошибку компоновщика:

In file included from src\ac.cpp:1:0:
src/ac.h:9:21: error: expected identifier before numeric constant
 #define RECEIVE_PIN 0
                     ^
src/ac.h:14:26: note: in expansion of macro 'RECEIVE_PIN'
     static IRrecv irrecv(RECEIVE_PIN);
                          ^
src/ac.h:9:21: error: expected ',' or '...' before numeric constant
 #define RECEIVE_PIN 0
                     ^
src/ac.h:14:26: note: in expansion of macro 'RECEIVE_PIN'
     static IRrecv irrecv(RECEIVE_PIN);
                          ^
*** [.pio\build\esp32cam\src\ac.cpp.o] Error 1
*** [.pio\build\esp32cam\src\main.cpp.o] Error 1

Я просто пытаюсь инициализировать ИК - приемник с помощью static IRrecv irrecv(RECEIVE_PIN);, но компилятор отказывается связывать его вместе.

#ifndef _AC_H_
#define _AC_H_

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

#define RECEIVE_PIN 0

class IR
{
public:
    static IRrecv irrecv(RECEIVE_PIN);
    static decode_results results;
    void initRecv();
    bool waitForIR();
};

extern IR ir;

#endif

Если я делаю static IRrecv irrecv; он успешно компилируется, но я не уверен, смогу ли я передать переменную pin после этого факта.

, 👍-1

Обсуждение

https://stackoverflow.com/questions/5019856/initialize-static-variables-in-c-class, @Mat

что произойдет, если вы используете RCV_PIN? ... похоже, RECEIVE_PIN-это макрос, @jsotola

@Mat Кажется, что невозможно изменить значение после его инициализации, @Jeebus

@jsotola Я переписал его в разных форматах. Я перепробовал все виды типов данных, имен и инициализировал их как irrecv(0)., @Jeebus


1 ответ


Лучший ответ:

2

Статические элементы данных должны быть определены вне объявления класса. Инициализация происходит в точке, где определены члены:

файл ac.h:

//...

class IR
{
public:
    // только статические элементы данных объявляются:
    static IRrecv irrecv;
    static decode_results results;
    void initRecv();
    bool waitForIR();
};

файл ac.cpp:

#include "ac.h"

#define RECEIVE_PIN 0

// Определения и инициализации статических элементов данных:
IRrecv IR::irrecv(RECEIVE_PIN);
decode_results IR::results;
,