C++ C+中的PTHREAD_MUTEX_初始值设定项+;成员函数无法编译?
我不能在类成员函数中初始化C++ C+中的PTHREAD_MUTEX_初始值设定项+;成员函数无法编译?,c++,pthreads,C++,Pthreads,我不能在类成员函数中初始化pthread\u mutex\t吗?在这种情况下使用,因为常量用于编译时初始化。而不是: class A { public: A(); private: pthread_mutex_t mu; }; A::A() { mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile } 试试这个: A::A() { mu = PTHREAD_MUTEX_INITIAL
pthread\u mutex\t
吗?在这种情况下使用,因为常量用于编译时初始化。而不是:
class A {
public:
A();
private:
pthread_mutex_t mu;
};
A::A()
{
mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile
}
试试这个:
A::A()
{
mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile
}
PTHREAD_MUTEX_初始值设定项是一个宏,一个类似{0,0,0,0,0{0}的C结构初始值设定项,只能在定义点使用。即使我们将其更改为在构造函数中使用初始值设定项列表,它仍然会失败:
A::A()
{
pthread_mutex_init( &(mu), NULL);
}
在C++03中使用嵌套大括号进行初始化是不合法的,但更有趣的是,C++11使这种语法和用法完全合法
在您的原始代码中,我们可以看到更多内容:
struct foo {
pthread_mutex_t test;
foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {}
};
我喜欢阿斯克米什和迭戈的回答。我也喜欢@Flexo的解释 但作为一个选项,如果您打算使用
PTHREAD\u MUTEX\u初始值设定项
宏进行初始化,您可以做的是,在类定义static
中声明互斥对象,如下所示:
A::A()
{
const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine
mu = test; // assignment - fine
mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only
}
class A {
public:
A();
private:
static pthread_mutex_t mu;
};
然后,您可以在源文件中但在任何成员函数之外初始化此静态互斥体,如下所示:
A::A()
{
const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine
mu = test; // assignment - fine
mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only
}
class A {
public:
A();
private:
static pthread_mutex_t mu;
};
您的选择:
- 因此,要么保持宏,要么保持静态(如图所示)。或者
- 您可以保持互斥体的声明不变(非静态),但在成员函数中使用
函数(如其他人所示)pthread\u mutex\u init()
pthread\u mutex\t
数据成员放在初始化列表中,可以吗?对不起,我指的是编译时初始化,不是静态初始化。是的,您也不能将其(至少如果不是在C++11中)放入初始化列表中。原始代码也是合法的C++11,可能您的编译器中没有启用C++11支持。@Alcott标准只有3个主要版本-不要将特定供应商的编译器版本与标准版本混合使用。