Rumah >pembangunan bahagian belakang >C++ >Mengapa Fungsi C Menyusun Tanpa Penyata Pulangan Eksplisit Walaupun Mengisytiharkan Jenis Pulangan?

Mengapa Fungsi C Menyusun Tanpa Penyata Pulangan Eksplisit Walaupun Mengisytiharkan Jenis Pulangan?

Susan Sarandon
Susan Sarandonasal
2024-12-13 04:41:15855semak imbas

Why Does a C   Function Compile Without an Explicit Return Statement Despite Declaring a Return Type?

Mengapa Coretan C Ini Disusun Walaupun Tiada Nilai Pulangan?

Dalam coretan kod yang disediakan:

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

Fungsi Min diisytiharkan sebagai mengembalikan tvec4, tetapi kod itu tidak memberikan pernyataan pulangan yang jelas. Ini menimbulkan persoalan mengapa pengkompil menyusun kod tanpa ralat.

Gelagat Tidak Ditakrifkan

Menurut piawaian draf C 11, mengalir keluar dari hujung nilai -fungsi pengembalian tanpa memberikan nilai pulangan menghasilkan tingkah laku yang tidak ditentukan. Ini bermakna bahawa pengkompil tidak diwajibkan untuk mengeluarkan ralat atau amaran dalam kes sedemikian.

Pilihan Pengkompil

Walau bagaimanapun, pengkompil boleh dikonfigurasikan untuk memberi amaran atau bahkan menjana ralat untuk tingkah laku yang tidak ditentukan. Sebagai contoh, menggunakan bendera -Wall selalunya boleh mencetuskan amaran seperti:

warning: control reaches end of non-void function [-Wreturn-type]

Dengan menambahkan bendera -Werror=return-type, pengkompil akan menganggap amaran ini sebagai ralat, memaksa kod menjadi diperbetulkan.

Visual Studio

Dalam Visual Studio, kod akan menghasilkan ralat C4716 secara lalai:

error C4716: 'Min' : must return a value

Dalam kes di mana tidak semua laluan kod mengembalikan nilai, Visual Studio akan mengeluarkan amaran (C4715).

Atas ialah kandungan terperinci Mengapa Fungsi C Menyusun Tanpa Penyata Pulangan Eksplisit Walaupun Mengisytiharkan Jenis Pulangan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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