GCC警告我将void函数传递给thrd_start_t

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

编辑:通过将函数类型更改为int解决了该问题!
我正在使用GCC编译器在Linux上使用threads.h库编写一个多线程测试程序。一些网站建议我在创建线程要使用的函数时使用void。但是,使用void类型会导致一个警告和一个注意事项:main.c:6:28: warning: passing argument 2 of 'thrd_create' from incompatible pointer type [-Wincompatible-pointer-types]/usr/include/threads.h:79:53: note: expected 'thread_start_t' {aka 'int(*) (void*)} but argument is of '(void*)()'。我有三个源文件:
主.c:

// . . .
int main() {
    thrd_t job1;
    thrd_create(&job1, tjob1, NULL);
    thrd_join(job1, NULL);
// . . .

作业.h:

void tjob1();
void tjob2();
void tjob3();

和作业。c:

// . . .
void tjob1(void) {
    system("date");
    printf("Doing jobs...");
    for(int i = 0; i < 50; i++) {
        system("date");
    }
}
// . . .

我是否应该关注注解和警告以及如何修复它?我尝试过将tjob 1设置为int void,这引发了一个错误,我尝试过将tjob 1修复为*tjob1/&tjob1,这也导致了错误。我尝试过找出tjob 1的理想类型以及如何将函数声明为int(*) (void*),但没有成功。因为这是thrd_start_t所接受的。
先谢谢你了

vjrehmav

vjrehmav1#

thrd_start_tint(*)(void*)typedef,这意味着你的线程启动函数tjob1有错误的签名。由于你显然不关心传递给它的参数(NULL)或返回值,这样的重写应该足够了:

int tjob1(void *dummy) { // correct return type and argument
    (void)dummy; // to quiet warnings about unused variables

    system("date");
    printf("Doing jobs...");
    for(int i = 0; i < 50; i++) {
        system("date");
    }

    return 0; // something has to be returned
}

相关问题