0

我正在做一个线程库(使用 uncontext.h 更改上下文)。我的函数是 void 类型,我无法返回。但是即使我不返回,编译时也会出现这个警告:

dccthread.c: In function ‘dccthread_init’:
dccthread.c:184:1: warning: ‘noreturn’ function does return [enabled by default]
 }

这是函数的简化代码(没有一些细节):

void dccthread_init(void (*func), int param) {
    int i=0;
    if (gerente==NULL)
    gerente = (dccthread_t *) malloc(sizeof(dccthread_t));

    getcontext(&gerente->contexto);
    gerente->contexto.uc_link = NULL;
    gerente->contexto.uc_stack.ss_sp = malloc ( THREAD_STACK_SIZE );
    gerente->contexto.uc_stack.ss_size = THREAD_STACK_SIZE;
    gerente->contexto.uc_stack.ss_flags = 0;
    gerente->tid=-1;

    makecontext(&gerente->contexto, gerente_escalonador, 0);
    if (principal==NULL)
    principal = (dccthread_t *) malloc(sizeof(dccthread_t));

    getcontext(&principal->contexto);
    principal->contexto.uc_link = NULL;
    principal->contexto.uc_stack.ss_sp = malloc ( THREAD_STACK_SIZE );
    principal->contexto.uc_stack.ss_size = THREAD_STACK_SIZE;
    principal->contexto.uc_stack.ss_flags = 0;
    makecontext(&principal->contexto, func, 1, param);
    swapcontext(&gerente->contexto, &principal->contexto);


}

请注意,我不会随时返回。但是 gcc 给了我这个警告。有谁知道是什么问题?

4

3 回答 3

3

在代码 C 的末尾插入一个隐式返回。无返回函数应在循环中运行或通过系统调用退出。它与返回但不传递值的 void 函数不同。

于 2014-05-04T04:15:33.390 回答
3

即使一个void函数返回,它只是不返回一个。Areturn;表示它返回到在前一个函数中调用它的位置,无论是否有新值。正如@Matthias 之前所说,任何函数都会在 C 的末尾自动返回。如果编译器到达函数的结束括号,它将返回。我相信您需要使用另一个函数调用或类似的方法离开该函数以消除警告。

我希望这有帮助。

于 2014-05-04T04:24:07.950 回答
1

仅仅因为你没有一个return并不意味着你的例程不能返回。从末端跌落(控制到达最后的闭括号)相当于返回。

因此

foo(x)
{
    ...
}

是相同的

foo(x)
{
    ...
    return;
}
于 2014-05-04T04:15:35.590 回答