Używam C ++ na ESP-32. Przy rejestracji timera muszę to zrobić:
timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback);
timer_args.arg = this;
Tutaj dzwoni zegar soundCallback
.
I to samo podczas rejestracji zadania:
xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle);
Tak więc metoda jest uruchamiana w oddzielnym zadaniu.
GCC zawsze ostrzega mnie przed tymi konwersjami, ale działa tak, jak zaplanowano.
Czy jest to dopuszczalne w kodzie produkcyjnym? Czy jest na to lepszy sposób?
std::bind
zakłada również wskaźnika obiektu jako argumentu pierwszej metody?extern "C"
tu potrzebuję ? Czy połączenie C jest ważne w tym przypadku?__attribute__((cdecl))
Ale nie rób tego). W przeciwnym razie nie można zagwarantować, że funkcja C ++ ma konwencję wywoływania zgodną z C (chociaż w GCC zwykle działa dobrze).extern "C"
jest to formalnie konieczne, zobacz[dcl.link]
„Dwa typy funkcji z różnymi powiązaniami językowymi są odrębnymi typami, nawet jeśli poza tym są identyczne”. oraz[expr.call]
„Wywołanie funkcji za pomocą wyrażenia, którego typ funkcji różni się od typu funkcji definicji wywoływanej funkcji, powoduje nieokreślone zachowanie”Osobiście najbardziej kompatybilnym, łatwym do wdrożenia i łatwym do zrozumienia podejściem, które znalazłem, jest po prostu zapewnienie funkcji „otoki”, kompatybilnej z oczekiwanym interfejsem C, który wewnętrznie wywołuje metodę (a jeśli nie jest statyczna, utworzyć instancję lub użyć do tego istniejącej instancji). Można to uznać za odmianę Wzorca Projektowania Adaptera.
źródło
static
, zobaczyłem to jako metodę i z jakiegoś powodu nie zdawałem sobie sprawy, żethis
wskaźnik nie jest pierwszym argumentem (i następną debatą na temat zastosowaniastd::bind
wzmocnionego go). Ale tak, masz absolutną rację! (Przepraszam za podwójną odpowiedź!)static
ma co najmniej trzy różne, różne znaczenia. I pomieszasz je, jeśli nie będziesz ostrożny. Powiedziałbym, że naprawdę pomocne jest zrozumienie różnic między różnymi zastosowaniamistatic
, ponieważ każde z nich jest doskonałym narzędziem.