gcc C:将不带参数的函数传递给pthread_create

vbkedwbf  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(133)

我很好奇下面的代码是否具有定义良好的行为:

#include <pthread.h>
#include <stdio.h>

void *f()
{
    printf("hey\n");
    return NULL;
}

int main()
{
    pthread_t th;
    if (pthread_create(&th, NULL, f, NULL) == 0) {
        pthread_join(th, NULL);
    }
}

如果我用-Wall -Wextra编译gcc,它不会产生任何警告(请参见此处:https://godbolt.org/z/fEvGesqad)。但是,我想知道为什么可以将f作为参数传递给pthread_create,因为需要一个签名为void xxx(void *)的函数。
这样做安全吗?还是会导致未定义的行为?
谢谢

ncecgwcz

ncecgwcz1#

我相信这是gcc和clang中的一个bug。
C标准规定
要使两个函数类型兼容,[...]如果一个类型具有参数类型列表,而另一个类型由包含参数类型列表的函数定义指定,(可能为空)标识符列表,两者的参数数量应一致,并且每个原型参数的类型都应该与将默认参数提升应用于相应标识符[...]
在这种情况下:

  • 一个类型具有指定void*类型的一个参数的参数类型列表
  • 另一种类型由函数 definition 给出,该函数具有用于参数列表的空标识符列表,因此指定零个参数(与不提供关于参数的信息相反)

因此,这两种类型是不兼容的。
请注意,this answer在本质上相同的情况下引用了标准中的相同段落,但却得出了相反的结论。

相关问题