我很好奇下面的代码是否具有定义良好的行为:
#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 *)
的函数。
这样做安全吗?还是会导致未定义的行为?
谢谢
1条答案
按热度按时间ncecgwcz1#
我相信这是gcc和clang中的一个bug。
C标准规定
要使两个函数类型兼容,[...]如果一个类型具有参数类型列表,而另一个类型由包含参数类型列表的函数定义指定,(可能为空)标识符列表,两者的参数数量应一致,并且每个原型参数的类型都应该与将默认参数提升应用于相应标识符[...]
在这种情况下:
void*
类型的一个参数的参数类型列表因此,这两种类型是不兼容的。
请注意,this answer在本质上相同的情况下引用了标准中的相同段落,但却得出了相反的结论。