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

関数が返っても、voidを返さないだけです。Aは、新しい値の有無にかかわらず、前の関数で呼び出された場所に戻ることを意味します。@Matthiasが以前に言ったように、どの関数もCの最後に自動復帰します。コンパイラが関数の終了ブラケットに到達すると、戻ります。警告を取り除くには、関数を別の関数呼び出しまたは同様のもので残す必要があると思います。return;

これが役立つことを願っています。

于 2014-05-04T04:24:07.950 に答える
3

コード C の最後に暗黙の return を挿入します。戻り値のない関数は、ループ内で実行されるか、システム コールによって終了することが期待されます。これは、値を返すが値を渡さない void 関数とは異なります。

于 2014-05-04T04:15:33.390 に答える
1

持っていないからといってreturn、ルーチンが戻らないわけではありません。最後から落ちる (コントロールが最後の閉じブレースに到達する) ことは、リターンと同等です。

したがって

foo(x)
{
    ...
}

と同じです

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