Rumah > pembangunan bahagian belakang > C++ > Mengapakah Fungsi C Tanpa Pernyataan `return` Eksplisit Disusun Tanpa Ralat?

Mengapakah Fungsi C Tanpa Pernyataan `return` Eksplisit Disusun Tanpa Ralat?

Patricia Arquette
Lepaskan: 2024-12-17 08:13:24
asal
515 orang telah melayarinya

Why Does a C   Function Without an Explicit `return` Statement Compile Without Error?

Fungsi Mengembalikan Nilai Tidak Ditakrifkan dalam C

Dalam coretan kod yang telah muncul dalam perpustakaan, fungsi bernama Min ditakrifkan seperti berikut:

static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out)
{
    tvec3::Min(a,b,out);
    out.w = min(a.w,b.w);
}
Salin selepas log masuk

Tidak dijangka, fungsi ini menyusun tanpa ralat walaupun tidak mengembalikan nilai, kerana jenis pemulangannya tidak diisytiharkan secara eksplisit sebagai batal.

Menurut piawaian draf C 11, seksyen 6.6.3, tingkah laku ini tidak ditentukan. Piawaian menyatakan bahawa "mengalir keluar dari hujung fungsi adalah bersamaan dengan pulangan tanpa nilai" dan bahawa "ini mengakibatkan tingkah laku tidak ditentukan dalam fungsi mengembalikan nilai."

Dalam senario ini, pengkompil ialah tidak bertanggungjawab untuk memberikan ralat atau amaran kerana mungkin sukar untuk mendiagnosis isu dengan tepat dalam semua kes.

Walau bagaimanapun, dengan -Bendera dinding, kedua-dua GCC dan Clang boleh digesa untuk menjana amaran yang serupa dengan:

warning: control reaches end of non-void function [-Wreturn-type]
Salin selepas log masuk

Untuk menukar amaran ini kepada ralat, memastikan tahap kualiti kod yang lebih tinggi, -Werror=return-type bendera boleh digunakan. Selain itu, bendera -Wextra -Wconversion -pedantic disyorkan untuk pengesanan ralat menyeluruh.

Dalam Visual Studio, kod yang disebutkan di atas akan mencetuskan ralat C4716:

error C4716: 'Min' : must return a value
Salin selepas log masuk

Dalam kes yang tidak semua kod laluan mengembalikan nilai, amaran C4715 akan dikeluarkan.

Atas ialah kandungan terperinci Mengapakah Fungsi C Tanpa Pernyataan `return` Eksplisit Disusun Tanpa Ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan