c语言 - 如何避免在将预处理器宏分配给数组成员时出错"Expected expression"



我想初始化大量的互斥对象来同步线程。

以下语法导致循环中出现构建错误"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步"初始化会导致生成错误,而"2步"运行良好?

对于一步初始化,是否有不同的语法可以工作?

从手册页,

在默认互斥属性合适的情况下,宏PTHREAD_mutex_INITIALIZER可用于初始化静态分配的互斥。该效果应等效于通过调用参数attr指定为NULL的pthread_mutex_init()进行的动态初始化,但不执行任何错误检查。

初始化变量时只能使用PTHREAD_MUTEX_INITIALIZER。它不能在作业中使用。

两者均使用=

mtxs[i] = PTHREAD_MUTEX_INITIALIZER;

是一个由赋值和组成的表达式

pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;

是一个带有初始值设定项的变量声明。有些类型的变量(例如数组(可以初始化,但我们无法将其赋值。

此外,初始化程序的语法与赋值右侧所允许的语法不同。PTHREAD_MUTEX_INITIALIZER在赋值的右侧可能无效。

在失败的代码中,您在赋值中使用PTHREAD_MUTEX_INITIALIZER,而它只能在初始值设定项中使用。请使用以下内容:

pthread_mutex_init(mtxs+i, NULL);

最新更新