2014-05-04 72 views
0

我在做一個線程庫(使用uncontext.h更改上下文)。 我的函數是void類型的,我不能返回。但是,即使我不回,編譯時出現此警告:警告:'noreturn'函數確實返回

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); 


} 

請注意,我不隨時返回。但海灣合作委員會給我這個警告。有誰知道有什麼問題?

回答

1

即使void函數返回,它只是不返回。 A return;意味着它返回到前一個函數中被調用的位置,有或沒有新值。正如@Matthias先前所說,任何函數都會以C結尾的自動返回。如果編譯器到達函數的尾括號,它將返回。我相信你需要用另一個函數調用或類似的東西離開函數來擺脫警告。

我希望這會有所幫助。

+0

這讓人懷疑。但我不知道我會怎麼做。但這是一個開始,我會尋找一種方法。謝謝。 –

+0

沒問題。很高興我可以幫忙一下。 – Jasper

2

在代碼C的末尾插入一個隱式返回。系統調用期望不返回函數在循環中運行或退出。 它與返回但不傳遞值的void函數不同。

1

僅僅因爲你沒有return並不意味着你的例程不能返回。落在最後(控制達到最後的大括號)相當於回報。

因此

foo(x) 
{ 
    ... 
} 

相同

foo(x) 
{ 
    ... 
    return; 
} 
相關問題