将预处理器宏分配给数组成员时如何避免 "Expected expression" 错误
How to avoid "Expected expression" error when assigning a preprocessor macro to an array member
我想初始化大量的互斥锁来同步线程。
以下语法导致循环内的构建错误 "Expected expression"
:
pthread_mutex_t *mtxs = malloc(MAX * sizeof(pthread_mutex_t));
for (size_t i=0; i<MAX; i++) {
mtxs[i] = PTHREAD_MUTEX_INITIALIZER;
}
我也尝试过使用指针运算而不是数组:
*(mtxs+i) = PTHREAD_MUTEX_INITIALIZER;
但得到同样的错误。
但是,以下代码使用 2 个步骤而不是 1 个步骤进行初始化,工作正常:
pthread_mutex_t *mtxs = malloc(MAX * sizeof(pthread_mutex_t));
for (size_t i=0; i<MAX; i++) {
pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
mtxs[i] = tmp;
}
为什么“1-step”初始化会导致构建错误,但“2-step”却能正常工作?
是否有适用于 1 步初始化的不同语法?
来自手册页,
In cases where default mutex attributes are appropriate, the macro PTHREAD_MUTEX_INITIALIZER can be used to initialize mutexes that are statically allocated. The effect shall be equivalent to dynamic initialization by a call to pthread_mutex_init()
with parameter attr
specified as NULL, except that no error checks are performed.
初始化变量时只能使用PTHREAD_MUTEX_INITIALIZER
。它不能在作业中使用。
虽然两者都使用 =
,
mtxs[i] = PTHREAD_MUTEX_INITIALIZER;
是由赋值组成的表达式,而
pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
是带有初始值设定项的变量声明。有一些类型的变量(例如数组)可以被初始化,但我们不能对其赋值。
此外,初始化器的语法与赋值的 right-hand 侧所允许的语法不同。 PTHREAD_MUTEX_INITIALIZER
可能在赋值的 right-hand 端无效。
在您的失败代码中,您在赋值中使用了 PTHREAD_MUTEX_INITIALIZER
,而它只能在初始化程序中使用。请改用以下内容:
pthread_mutex_init(mtxs+i, NULL);
我想初始化大量的互斥锁来同步线程。
以下语法导致循环内的构建错误 "Expected expression"
:
pthread_mutex_t *mtxs = malloc(MAX * sizeof(pthread_mutex_t));
for (size_t i=0; i<MAX; i++) {
mtxs[i] = PTHREAD_MUTEX_INITIALIZER;
}
我也尝试过使用指针运算而不是数组:
*(mtxs+i) = PTHREAD_MUTEX_INITIALIZER;
但得到同样的错误。
但是,以下代码使用 2 个步骤而不是 1 个步骤进行初始化,工作正常:
pthread_mutex_t *mtxs = malloc(MAX * sizeof(pthread_mutex_t));
for (size_t i=0; i<MAX; i++) {
pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
mtxs[i] = tmp;
}
为什么“1-step”初始化会导致构建错误,但“2-step”却能正常工作?
是否有适用于 1 步初始化的不同语法?
来自手册页,
In cases where default mutex attributes are appropriate, the macro PTHREAD_MUTEX_INITIALIZER can be used to initialize mutexes that are statically allocated. The effect shall be equivalent to dynamic initialization by a call to
pthread_mutex_init()
with parameterattr
specified as NULL, except that no error checks are performed.
初始化变量时只能使用PTHREAD_MUTEX_INITIALIZER
。它不能在作业中使用。
虽然两者都使用 =
,
mtxs[i] = PTHREAD_MUTEX_INITIALIZER;
是由赋值组成的表达式,而
pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
是带有初始值设定项的变量声明。有一些类型的变量(例如数组)可以被初始化,但我们不能对其赋值。
此外,初始化器的语法与赋值的 right-hand 侧所允许的语法不同。 PTHREAD_MUTEX_INITIALIZER
可能在赋值的 right-hand 端无效。
在您的失败代码中,您在赋值中使用了 PTHREAD_MUTEX_INITIALIZER
,而它只能在初始化程序中使用。请改用以下内容:
pthread_mutex_init(mtxs+i, NULL);