我正在编写一个C类,它提供了一个缓冲池 . 该类包含实际(私有)池和公共函数,返回指向空闲缓冲区的指针 . 类声明在hpp文件中 .
CTransmissionBuffers.hpp
class CTransmissionBuffers {
public:
static constexpr uint32_t buffer_length = 1000;
struct Transmissionbuffer_T
{
osMutexId mutex;
uint8_t data[buffer_length];
osThreadId thread_id;
};
CTransmissionBuffers();
virtual ~CTransmissionBuffers();
static bool Init_Transmission_Buffers();
static Transmissionbuffer_T* Get_New_Transmission_Buffer();
static void Free_Transmission_Buffer(Transmissionbuffer_T* pBuffer);
private:
static constexpr uint32_t n_buffer = 3;
static Transmissionbuffer_T buffer_pool[n_buffer];
};
CTransmissionBuffers.cpp
#include <CTransmissionBuffers.hpp>
CTransmissionBuffers::Transmissionbuffer_T buffer_pool[CTransmissionBuffers::n_buffer] = {}; /// this causes the problem
CTransmissionBuffers::CTransmissionBuffers()
{
// TODO Auto-generated constructor stub
}
CTransmissionBuffers::~CTransmissionBuffers()
{
// TODO Auto-generated destructor stub
}
bool CTransmissionBuffers::Init_Transmission_Buffers()
{
for (uint32_t i = 0; i < n_buffer; i++)
{
buffer_pool[i].mutex = osMutexCreate(nullptr);
if (nullptr == buffer_pool[i].mutex)
{
return false;
}
}
return true;
}
CTransmissionBuffers::Transmissionbuffer_T* CTransmissionBuffers::Get_New_Transmission_Buffer()
{
Transmissionbuffer_T* pBuffer = nullptr;
for (uint32_t i = 0; i < n_buffer; i++)
{
if (osOK == osMutexWait(buffer_pool[i].mutex, 0))
{
//Mutex erhalten
pBuffer = &(buffer_pool[i]);
break;
}
}
return pBuffer;
}
void CTransmissionBuffers::Free_Transmission_Buffer(Transmissionbuffer_T* pBuffer)
{
if(nullptr == pBuffer)
{
return;
}
osMutexRelease(pBuffer->mutex);
}
在编译之后我得到了一个未定义的buffer_pool引用,所以我尝试添加一个
CTransmissionBuffers::Transmissionbuffer_T buffer_pool[CTransmissionBuffers::n_buffer] = {};
到相应的cpp文件但是无法访问n_buffer,因为它是私有的:(
我是否必须定义静态成员?你有一些好主意如何解决这个问题?
迎接朱利安
2 回答
在做了一些研究之后,事实证明只有gcc 7支持内联变量(参见https://gcc.gnu.org/projects/cxx-status.html)但是我坚持使用gcc6 .
我通过放置一个来初始化缓冲区
在cpp文件的开头 . 接缝工作 . 非常感谢你的帮助 :)
您的语法已关闭 . Transmissionbuffer_T不是您 class 的成员,但是您 class 成员的类型 . 静态定义应如下所示:
在C 17中,您可以使用内联变量作为解决此问题的更方便的方法:
如果您将其声明为内联变量,请不要在类外部声明该变量,否则您将拥有重复的定义并获得错误 .
注意:constexpr静态成员是隐式内联的,因此不需要为n_buffer正常工作做任何事情 .