2013-04-12 20 views
7

döndürüyor Aşağıdaki C programını derlediğimde şu uyarıyı alırım: ‘noreturn’ function does return. Bu, aşağıdaki işlevdir: Bu neden olabilir? tam hata çıktı:‘noreturn’ işlevi

home.c: In function ‘hello’: 
hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable] 
home.c:840:1: error: ‘noreturn’ function does return [-Werror] 
cc1: all warnings being treated as errors 
make: *** [home.o] Error 1 
+0

Tam derleyici uyarısını gönderir misiniz? –

+9

Lütfen bir [SSCCE] (http://sscce.org/) oluşturabilir ve bize tam bir örnek gösterebilir misiniz? Ayrıca lütfen _all_ ve _complete_ hata/uyarı mesajlarını da ekleyin. –

+2

Hangi derleyiciyi kullanıyorsunuz? Hangi derleyici seçeneklerini kullandınız? – Bechir

cevap

24

Belli bir işlevi asla döndürür gcc söylemek mümkündür bu fonksiyona tüm çağrı hello();

DÜZENLEME olduğunu. Bu, belirli optimizasyonlara izin verir ve başlatılmamış değişkenlerin sahte uyarılarını önlemeye yardımcı olur.

Bu

noreturn attribute kullanılarak yapılır: function noreturn öznitelik rağmen çıkmıyor

void func() __attribute__ ((noreturn)); 

ise derleyici (sizin durumunuzda bir hata dönüştürülmüş olur) Gördüğünüz uyarı yayar. kodunuzda noreturn kullanıyor olası olduğundan beri

, olası açıklama size Adını çatışmalar standart noreturn fonksiyonu ile, aşağıdaki örnekte olduğu gibi bir işlevi olduğunu: Burada

#include <stdlib.h> 

void exit(int) { 
}    // warning: 'noreturn' function does return [enabled by default] 

, exit benim exit(3) ile çakışıyor. Böyle bir çarpışma için başka bir açık aday ise abort(3)'dur. Tabii ki, eğer işleviniz aslında hello() olarak adlandırılıyorsa, suçlu kesinlikle kod tabanınızda bir yerdedir.

4

Muhtemelen, işlev __attribute__((noreturn)) ile işaretlenmiştir. Bununla birlikte, aslında geri dönüş (kontrol, irs gövdesinin sonuna ulaştığında, sonsuz bir döngüye girmediğinden, başka "noreturn" işlevlerini çağırmaz, vb.).

Göremiyorum noktanız nedir? 1. işlevi geri dönüşsüz olarak işaretlemek, 2. hiçbir şey yapmayan bir işlev yazmak - muhtemelen her ikisini de ortadan kaldırabilirsiniz?

+3

Bu cevaba açıklık: __attribute __ ((noreturn)) işlevi için, işlev gövdesi sonsuz bir döngü ile bitmezse veya başka bir noreturn işlevine çağrı yapmazsanız, bu uyarıyı alırsınız. Başka bir deyişle, derleyici "akış analizi" yapar ve fonksiyonun gerçekten geri dönüp dönemeyeceğini belirleyebilir. Kapanış ayracında örtülü bir geri dönüş olduğunu unutmayın. – bootchk

+3

@bootchk, "sonsuz döngü" için +1. 'f() {}' uyarı/hata üretir. 'f() {while (1); } 'tamam. Teşekkürler – user3124812