将预处理器宏分配给数组成员时如何避免 "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);