Saya memiliki *.cpp
file yang saya kompilasi dengan C ++ (bukan kompiler C). Fungsi yang berisi bergantung pada pemain (lihat baris terakhir) yang tampaknya didefinisikan dalam C (tolong perbaiki jika saya salah!), Tetapi tidak dalam C ++ untuk jenis khusus ini.
[...] C++ code [...]
struct sockaddr_in sa = {0};
int sockfd = ...;
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
bind(sockfd, (struct sockaddr *)&sa, sizeof sa);
[...] C++ code [...]
Karena saya mengkompilasi ini dalam file C ++, apakah ini perilaku yang sekarang didefinisikan atau tidak terdefinisi? Atau apakah saya perlu memindahkan ini ke *.c
file, untuk membuatnya menjadi perilaku yang didefinisikan?
c++
c
undefined-behavior
Daniel Stephens
sumber
sumber
.c
ekstensi, kompiler C dipanggil secara otomatis.Jawaban:
Ini didefinisikan dalam C ++ dan C. Ini tidak melanggar peraturan aliasing yang ketat karena tidak mengubah pointer yang dihasilkan.
Inilah kutipan dari C ++ (terima kasih kepada @interjay dan @VTT) yang memungkinkan ini:
Inilah kutipan dari C (terima kasih @StoryTeller) yang memungkinkan ini:
Ini menentukan bahwa satu tipe pointer dapat dikonversi ke tipe pointer lain (dan kemudian secara opsional dikonversi kembali) tanpa konsekuensi.
Dan inilah kutipan dari POSIX yang memungkinkan kasus khusus ini:
Karena fungsi ini (
bind
) adalah bagian dari pustaka standar C, apa pun yang terjadi di dalam (khususnya, menandakan pointer tipe-dicor) tidak memiliki perilaku yang tidak ditentukan.Untuk menjawab pertanyaan yang lebih umum:
C dan C ++ adalah dua bahasa yang berbeda. Jika sesuatu didefinisikan dalam C tetapi tidak dalam C ++, itu didefinisikan dalam C tetapi tidak dalam C ++. Tidak ada kompatibilitas yang tersirat antara kedua bahasa yang akan mengubah itu. Jika Anda ingin menggunakan kode yang didefinisikan dengan baik dalam C tetapi tidak terdefinisi dalam C ++, Anda harus menggunakan kompiler C untuk mengkompilasi kode itu.
sumber
bind
harus aconst void *
, tetapibind
mendahului keberadaanvoid
dalam bahasa C (dan keberadaan C ++ sama sekali). Mereka memperbaruinya di beberapa titik untuk menambahkanconst
, tetapi tidak pernah memperbaiki tipe dasar.Panggilan antara kode C dan C ++ semua memanggil Perilaku Tidak Terdefinisi, dari sudut pandang standar masing-masing, tetapi sebagian besar platform menentukan hal-hal seperti itu.
Dalam situasi di mana bagian dari Standar C atau C ++ dan dokumentasi implementasi bersama-sama mendefinisikan atau menggambarkan suatu tindakan, tetapi bagian lain mencirikannya sebagai Tidak Terdefinisi, implementasi diizinkan untuk memproses kode dengan cara apa pun yang paling sesuai dengan kebutuhan pelanggan mereka atau - jika mereka tidak peduli dengan kebutuhan pelanggan - busana apa pun yang mereka sukai. Fakta bahwa Standar menganggap hal-hal seperti di luar yurisdiksi mereka tidak menyiratkan penilaian kapan dan / atau bagaimana implementasi yang mengklaim kesesuaian untuk berbagai tujuan harus diharapkan untuk memprosesnya secara bermakna, tetapi beberapa pembuat kompiler menganut mitos yang berlaku.
sumber