Использование переменной библиотеки c / члена структуры в функции-члене класса C ++

Я недавно начал читать о Alsa Api. Я пытался написать класс C ++, который открывает устройство по умолчанию и считывает основные параметры, такие как максимальная скорость, количество каналов и т. Д.

Мой заголовочный файл класса:

#include <alsa/asoundlib.h>
#include <iostream>
class AlsaParam{
snd_pcm_t* pcm_handle;
snd_pcm_hw_params_t* hw_param;
....

public:
int pcm_open();
.....

};

Внутри pcm_open ()

int AlsaParam::pcm_open(){
int err = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
if(err > -1)
std::cout << pcm_handle->name << std::endl;   //Just to test if it works

return err;
}

Я получаю следующую ошибку:

error: invalid use of incomplete type ‘snd_pcm_t {aka struct _snd_pcm}’
std::cout << pcm_handle->name << std::endl;
^
In file included from /usr/include/alsa/asoundlib.h:54:0,
from alsa_param.h:4,
from alsa_param.cpp:1:
/usr/include/alsa/pcm.h:341:16: error: forward declaration of ‘snd_pcm_t {aka struct _snd_pcm}’
typedef struct _snd_pcm snd_pcm_t;
^

Из этой ошибки я понял, что asoundlib.h использует typedef только для struct snd_pcm_t, но он определен где-то еще. Я прав? Есть ли способ решить эту проблему? В общем, если мы включаем некоторые функции библиотеки c в класс C ++, что следует помнить / избегать? Спасибо

1

Решение

Макет struct _snd_pcm намеренно скрыт от программ, поскольку может измениться в новой версии библиотеки.

Чтобы узнать имя устройства PCM, позвоните snd_pcm_name:

cout << snd_pcm_name(pcm_handle) << endl;

(Практически все в ALSA нуждается в таком вызове функции.)

2

Другие решения

В вашем коде нет ничего плохого. Просто отсутствует декларация struct _snd_pcmзаголовок, который вы включили, имеет только typedef: typedef struct _snd_pcm snd_pcm_t;

Что вы можете сделать, это посмотреть (возможно, в Интернете или в руководстве) для заголовка, который имеетstruct _snd_pcm объявление и включить его в свой код.

0

Есть несколько различий в синтаксисе объявления между C и C ++.

Поскольку вы компилируете файл C ++, но включаете в него заголовок C, вам, вероятно, нужно заставить компилятор правильно интерпретировать его.

Попробуй это:

extern "C"{
#include <alsa/asoundlib.h>
}

#include <iostream>
class AlsaParam{
snd_pcm_t* pcm_handle;
snd_pcm_hw_params_t* hw_param;
...
-1