我正在做一个线程库(用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给我这个警告。有人知道是什么问题吗?
即使void
函数返回,它也不返回值。return;
意味着它返回到前一个函数中调用它的地方,无论是否有新值。正如@Matthias之前所说,任何函数在C结尾都会有一个自动返回。如果编译器到达函数的结束括号,它将返回。我相信你需要用另一个函数调用或类似的东西来离开这个函数,以摆脱警告。
我希望这对你有帮助。
在C代码的末尾插入一个隐式返回。无返回函数应该在循环中运行或通过系统调用退出。它不同于返回但不传递值的void函数。
仅仅因为你没有return
并不意味着你的例程不能返回。脱离结束(控制到达最后的右括号)相当于return。
foo(x)
{
...
}
与
相同foo(x)
{
...
return;
}