Saya menggunakan C ++ pada ESP-32. Saat mendaftarkan timer saya harus melakukan ini:
timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback);
timer_args.arg = this;
Di sini timer memanggil soundCallback
.
Dan hal yang sama saat mendaftarkan tugas:
xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle);
Jadi metode ini dimulai dalam tugas yang terpisah.
GCC selalu memperingatkan saya tentang konversi ini, tetapi itu berfungsi seperti yang direncanakan.
Apakah ini dapat diterima dalam kode produksi? Apakah ada cara yang lebih baik untuk melakukan ini?
std::bind
juga menganggap penunjuk objek sebagai argumen metode pertama?extern "C"
sini? Apakah hubungan C penting dalam kasus ini?__attribute__((cdecl))
, tapi tolong jangan lakukan itu). Fungsi C ++ tidak dijamin memiliki konvensi panggilan yang kompatibel dengan C jika tidak (meskipun dalam GCC biasanya berfungsi dengan baik).extern "C"
secara formal diperlukan, lihat[dcl.link]
"Dua tipe fungsi dengan hubungan bahasa yang berbeda adalah tipe yang berbeda walaupun mereka identik." dan[expr.call]
"Memanggil fungsi melalui ekspresi yang tipe fungsinya berbeda dari tipe fungsi dari definisi fungsi yang disebut menghasilkan perilaku yang tidak ditentukan"Secara pribadi, pendekatan yang paling kompatibel, mudah diimplementasikan dan mudah dipahami yang saya temukan adalah dengan hanya menyediakan fungsi "wrapper", kompatibel dengan antarmuka C yang diharapkan, yang secara internal memanggil metode (dan, jika itu tidak statis, instantiate atau gunakan instance yang ada untuk melakukan itu). Itu bisa dilihat sebagai semacam variasi dari Pola Desain Adaptor.
sumber
static
saya melihatnya sebagai metode dan untuk beberapa alasan tidak menyadari itu tidak melewatithis
pointer sebagai argumen pertama (dan perdebatan berikut tentang penggunaanstd::bind
diperkuat). Tapi ya, Anda memang benar! (Maaf untuk jawaban ganda!)static
memiliki setidaknya tiga makna berbeda. Dan Anda akan mencampurnya jika Anda tidak hati-hati. Saya akan mengatakan, sangat membantu untuk memahami perbedaan antara penggunaan yang berbedastatic
, karena masing-masing adalah alat yang hebat dalam dirinya sendiri.