Dukungan Visual Studio untuk standar C / C ++ baru?

102

Saya terus membaca tentang C99 dan C ++ 11 dan semua hal yang sangat manis ini yang ditambahkan ke standar bahasa yang mungkin bagus untuk digunakan suatu hari nanti. Namun, saat ini kami merana di tanah penulisan C ++ di Visual Studio.

Akankah hal baru dalam standar ditambahkan ke studio visual, atau apakah Microsoft lebih tertarik untuk menambahkan varian C # baru untuk melakukan itu?

Sunting: Selain jawaban yang diterima, saya menemukan blog tim Visual C ++:

http://blogs.msdn.com/vcblog/

Dan secara khusus, posting ini di dalamnya:

https://web.archive.org/web/20190109064523/https://blogs.msdn.microsoft.com/vcblog/2008/02/22/tr1-slide-decks/

Sangat berguna. Terima kasih!

Colen
sumber
3
Saya tidak mengerti apa yang berguna yang Anda temukan di artikel 2008/02 dari vcblog karena fitur-fitur yang dijelaskan di sana sudah lama ada di boost dan cukup terkenal. Fitur C ++ 0x yang mengubah dunia berbeda: fungsi lambda, penginisialisasi, dll. Yang tercantum di en.wikipedia.org/wiki/C%2B%2B0x .
amit
Lihat blogs.msdn.com/vcblog/archive/2009/04/22/… artikel terbaru juga (saya tahu ini lebih lambat dari saat pertanyaan diajukan)
amit
1
Ini telah sangat ditingkatkan dalam versi Visual Studio terbaru, seperti 2015 Pembaruan 2: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres
Pertimbangkan untuk mencoba MinGW-64
Basile Starynkevitch

Jawaban:

103

MS memiliki serangkaian balasan publik untuk ini, kebanyakan dari mereka menyalahkan penggunanya. Seperti yang ini:

https://devblogs.microsoft.com/cppblog/iso-c-standard-update/

Sekarang, tim kompilator Visual C ++ menerima pertanyaan sesekali tentang mengapa kami belum mengimplementasikan C99. Ini benar-benar berdasarkan minat dari pengguna kami. Saat kami menerima banyak permintaan untuk fitur C99 tertentu, kami telah mencoba menerapkannya (atau analog). Beberapa contoh adalah macro variadic, long long, __pragma, __FUNCTION__, dan __restrict. Jika ada fitur C99 lain yang Anda anggap berguna dalam pekerjaan Anda, beri tahu kami! Kami tidak banyak mendengar dari pengguna C kami, jadi bicaralah dan buatlah diri Anda didengar

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345360

Hai: sayangnya, feadback luar biasa yang kami dapatkan dari sebagian besar pengguna kami adalah mereka lebih suka kami fokus pada C ++ - 0x daripada C-99. Kami memiliki fitur C-99 populer tertentu yang "dipilih dengan baik" (makro variadic, long long) tetapi di luar ini kami tidak mungkin melakukan lebih banyak lagi di ruang C-99 (setidaknya dalam jangka pendek).

Gua Jonathan

Tim Penyusun Visual C ++.

Ini adalah keadaan yang cukup menyedihkan, tetapi juga masuk akal jika Anda mencurigai MS ingin mengunci pengguna: itu membuatnya sangat sulit untuk mem-port kode berbasis gcc modern ke MSVC, yang setidaknya menurut saya sangat menyakitkan.

Ada solusi, meskipun: Perhatikan bahwa Intel jauh lebih tercerahkan dalam hal ini. kompiler Intel C dapat menangani kode C99 dan bahkan memiliki flag yang sama dengan gcc, membuatnya lebih mudah untuk mem-port kode antar platform. Juga, kompiler Intel bekerja di studio visual. Jadi dengan mengikis MS COMPILER Anda masih dapat menggunakan MS IDE yang menurut Anda memiliki nilai, dan menggunakan C99 sesuka hati Anda.

Pendekatan yang lebih masuk akal adalah dengan jujur ​​beralih ke Intel CC atau gcc, dan menggunakan Eclipse untuk lingkungan pemrograman Anda. Portabilitas kode di Windows-Linux-Solaris-AIX-etc biasanya penting menurut pengalaman saya, dan sayangnya itu sama sekali tidak didukung oleh alat MS.

jakobengblom2
sumber
42
Namun, saya rasa alasan sebenarnya mereka adalah persis seperti yang mereka katakan: Komunitas C di Windows mungkin hampir tidak ada, atau dapat diabaikan jika dibandingkan dengan komunitas C ++ / C # /. NET / ASP. Jadi, mereka memiliki poin yang valid. Meskipun saya memiliki Linux, dan seperti g ++, saya tidak akan membatalkan MSVC ++ hanya karena C99, maaf.
paercebal
11
Jika mereka setidaknya memberikan kami untuk (int i ;;) dan inline.
Nick Van Brunt
2
Bagian terbaik dari jawaban mereka tentang pengembangan berorientasi C ++ 0x adalah bahwa sekarang, lebih dari 4 tahun kemudian, mereka masih hampir tidak memiliki dukungan C ++ 11. (Sementara itu gcc mendukung hampir semuanya.)
GManNickG
10
Pratinjau FWIW, VC2013 sekarang mendukung standar C ++ 11 dan C99. Lihat yang baru untuk C / C ++ devs .
gagak vulcan
37

Herb Sutter adalah ketua dan anggota komite standardisasi C ++ yang sangat aktif, serta arsitek perangkat lunak di Visual Studio untuk Microsoft.

Dia adalah salah satu penulis model memori C ++ baru yang distandarisasi untuk C ++ 0x. Misalnya kertas-kertas berikut ini:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2669.htm
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007 /n2197.pdf

ada namanya di atasnya. Jadi saya kira penyertaan pada Windows C ++ 0x dijamin selama H. ​​Sutter tetap di Microsoft.

Adapun C99 hanya sebagian dimasukkan dalam Visual Studio, saya rasa ini adalah pertanyaan prioritas.

  • Fitur C99 yang paling menarik sudah ada di C ++ (sebaris, deklarasi variabel di mana saja, // komentar, dll.) Dan mungkin sudah dapat digunakan di C dalam Visual Studio (Jika hanya melakukan kode C dalam kompiler C ++). Lihat jawaban saya di sini untuk pembahasan lebih lengkap tentang fitur C99 di C ++.
  • C99 meningkatkan divergensi antara C dan C ++ dengan menambahkan fitur yang sudah ada di C ++, tetapi dengan cara yang tidak kompatibel (maaf, implementasi kompleks boolean di C99 menggelikan, paling-paling ... Lihat http://david.tribble.com/ teks / cdiffs.htm untuk informasi lebih lanjut)
  • Komunitas C di Windows tampaknya tidak ada atau tidak cukup penting untuk diketahui
  • Komunitas C ++ di Windows tampaknya terlalu penting untuk diabaikan
  • .NET adalah cara Microsoft ingin orang memprogram di Windows. Ini berarti C #, VB.NET, mungkin C ++ / CLI.

Jadi, apakah saya akan menjadi Microsoft, mengapa saya menerapkan fitur yang hanya akan digunakan oleh sedikit orang ketika fitur yang sama sudah ditawarkan dalam lebih banyak bahasa aktif komunitas yang sudah digunakan oleh kebanyakan orang?

Kesimpulan?

C ++ 0x akan disertakan, sebagai perpanjangan dari VS 2008, atau pada Visual Studio generasi berikutnya (generasi?).

Fitur C99 yang belum diimplementasikan tidak akan diterapkan di tahun-tahun mendatang, kecuali terjadi sesuatu yang dramatis (negara yang penuh dengan pengembang C99 muncul entah dari mana?)

Sunting 2011-04-14

Rupanya, "negara yang penuh dengan pengembang C99" sudah ada: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Tetap saja, komentar terakhir di: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 cukup jelas, saya rasa.

Sunting 2012-05-03

Herb Sutter menjelaskan bahwa:

  1. Sasaran utama kami adalah mendukung "sebagian besar C99 / C11 yang merupakan subset dari ISO C ++ 98 / C ++ 11".
  2. Kami juga karena alasan historis mengirimkan kompiler C90 yang menerima (hanya) C90 dan bukan C ++
  3. Kami tidak berencana untuk mendukung fitur ISO C yang bukan merupakan bagian dari C90 atau ISO C ++.

Posting blog menambahkan tautan dan penjelasan lebih lanjut untuk keputusan tersebut.

Sumber: http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/

paercebal.dll
sumber
1
Agar adil - implementasi boolean di C99 dilakukan untuk memungkinkan kompatibilitas ke belakang dengan kode waras (yaitu kode yang mendefinisikan bool memiliki boolean).
Maciej Piechotka
19
Ini: "Fitur C99 yang paling menarik sudah ada di C ++" adalah salah. Format dan literal floating-point heksadesimal. Fungsi perpustakaan matematika C99. Penginisialisasi bernama untuk struct / unions. Kata restrictkunci. Ada banyak sekali fitur C99 hebat yang hilang dari C ++, dan itu adalah fitur yang saya gunakan setiap hari sebagai programmer C.
Stephen Canon
1
@ Stephen Canon: Silakan baca jawaban saya di: stackoverflow.com/questions/3879636/… . Tentu saja, ini adalah jawaban C ++ untuk pengembang C ++, jadi tidak cocok untuk pengembang C yang tidak ingin menggunakan kelas, konstruktor, atau fungsi matematika yang kelebihan beban (siapa yang membutuhkan tgmath.h dalam C ++?). Intinya: Yang penting sudah ada, atau mudah diterapkan. Sedangkan untuk restrictkata kunci, Anda masih bisa menggunakan di C ++, ternyata: stackoverflow.com/questions/776283/… . . .
paercebal
5
@paercebal: Anda berhak atas sudut pandang itu, tetapi tidak ada apa pun dalam C ++ yang akan membujuk saya untuk melepaskan literal floating-point heksadesimal. Inilah maksud saya. Tentu saja programmer C ++ tidak peduli dengan fitur C99; mungkin itulah sebabnya mereka adalah programmer C ++. Sebaliknya, ada banyak pemrogram C di luar sana yang sama sekali tidak peduli dengan fitur C ++, dan hanya ingin Microsoft menyediakan kompiler C yang setidaknya mencoba untuk mematuhi standar seperti yang dilakukan orang lain.
Stephen Canon
13
@paercebal: "ekuivalen" tidak berguna. Ada jutaan baris kode C portabel yang berfungsi dengan baik di setiap platform lain. Apakah Anda menyarankan agar mereka ditulis ulang? Komunitas pengguna C99 cukup besar sehingga setiap vendor kompilator utama lainnya setidaknya mencoba untuk memberikan kompatibilitas: IBM, HP, Apple, Intel, GNU, Sun, ARM, kompiler perangkat tertanam yang tak terhitung banyaknya, dll. C99 mungkin tidak penting bagi pemrogram Windows , tetapi program Windows mewakili sebagian kecil dari total kode yang ditulis.
Stephen Canon
11

Mulai dari VC2013 pratinjau 1 , C99, satu set C ++ 11 yang lebih beragam dan beberapa standar C ++ 14 yang baru diperkenalkan didukung. Lihat blog resmi untuk detail lebih lanjut: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Memperbarui:

Dari https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej alias: STL adalah pengelola tim STL @VC):

Secara khusus, pada tahun 2015 implementasi Library Standar C99 kami selesai, kecuali untuk tgmath.h (tidak relevan di C ++) dan makro pragma CX_LIMITED_RANGE / FP_CONTRACT.

Lihat posting ini untuk detailnya: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .

gagak vulcan
sumber
Hanya sebagian dukungan untuk C99 sejauh yang saya tahu: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Kami tahu bahwa ini bukan dukungan lengkap untuk fungsi perpustakaan C99."
sdfqwerqaz1
@ sdfqwerqaz1, lihat komentar dari STL di sini : "tim compiler dan library akan mempertimbangkannya berdasarkan kasus per kasus, tetapi prioritas utama kami adalah kesesuaian C ++. Misalnya, karena C ++ 11/14 menggabungkan C99 Standard Library berdasarkan referensi, Pratinjau 2015 sepenuhnya mendukung Library Standar C99 (dengan satu-satunya kelalaian adalah tgmath.h, yang memerlukan sihir compiler C dan tidak relevan dengan C ++ yang mengalami kelebihan beban, dan CX_LIMITED_RANGE / FP_CONTRACT yang juga memerlukan dukungan compiler) " .
gagak vulcan
8

Saya telah terlibat dalam pekerjaan ISO C ++ (2000-2005), dan Microsoft memberikan kontribusi signifikan pada bahasa itu. Tidak ada keraguan bahwa mereka akan bekerja pada C ++ 0x, tetapi mereka membutuhkan lebih banyak waktu daripada yang dikatakan Intel. Micosoft harus berurusan dengan basis kode yang lebih besar yang sering menggunakan ekstensi miliknya. Ini hanya membuat testfase yang lebih lama. Namun, mereka akan mendukung sebagian besar C ++ 0x pada akhirnya (ekspor masih tidak disukai, atau begitulah yang saya mengerti).

Ketika datang ke ISO C, orang yang mengerjakan standar tidak mewakili pasar Microsoft. Pelanggan Microsoft dapat menggunakan C ++ 98 jika mereka hanya mencari C yang lebih baik. Jadi mengapa Microsoft mengeluarkan uang untuk C99? Tentu, Microsoft memilih suku cadang, tapi itu bisnis yang waras. Mereka akan membutuhkannya untuk C ++ 0x, jadi mengapa menunggu?

MSalters
sumber
7

Sayangnya dukungan MSVC untuk C sangat kurang. Ini hanya mendukung porsi C99 yang merupakan subset dari C ++ ... yang berarti, misalnya, secara fisik tidak mungkin untuk mengkompilasi ffmpeg atau pustaka libav * di MSVC, karena mereka menggunakan banyak fitur C99 seperti elemen struct bernama. Hal ini diperparah oleh fakta bahwa libavcodec juga memerlukan kompiler yang memelihara penyelarasan stack, yang tidak dimiliki MSVC.

Pekerjaan yang saya pada x264, yang tidak seperti ffmpeg tidak melakukan upaya untuk mendukung MSVC, meskipun demikian sering menjadi mimpi buruk dalam dan dari dirinya sendiri. Itu tidak mempertahankan penyelarasan tumpukan bahkan jika Anda secara eksplisit meneruskan panggilan fungsi tertinggi melalui fungsi penyelarasan tumpukan berbasis perakitan eksplisit, jadi semua fungsi yang memerlukan tumpukan selaras harus dinonaktifkan. Juga sangat menjengkelkan karena saya juga tidak bisa menggunakan vararrays; mungkin ini yang terbaik, karena tampaknya GCC sangat pesimis terhadap kinerja mereka.

Dark Shikari
sumber
6

Sebuah posting terbaru tentang kompatibilitas fitur C ++ 11 MSVC untuk MSVC 2010 dan 2011 sekarang online .

fbrereto
sumber
4

Microsoft tidak pernah menyatakan minat nyata untuk mengikuti kecepatan standar c99 (yang semakin tua sekarang). Sedih bagi C-programmer, tetapi saya curiga Microsoft lebih peduli pada komunitas C ++.

JesperE
sumber
4

Visual C ++ 2008 SP1 setidaknya berisi bagian-bagian TR1, dan dari waktu ke waktu, tim Visual C ++ sedang ngeblog atau berbicara tentang C ++ 0x, jadi saya kira mereka akan mendukungnya pada suatu saat dalam fitur ini. Aku tidak membaca apapun yang resmi.

OregonGhost
sumber
4

Informasi terbaru tentang ini:

Sekarang ada (10 Nov 2008) "Community Tech Preview" (CTP) dari VS2010 yang berisi pratinjau VC10 yang memiliki beberapa bagian C ++ 0x yang diimplementasikan (perhatikan bahwa VC10 tidak akan memiliki set lengkap C ++ 0x perubahan diterapkan bahkan ketika VC10 dirilis):

http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en

Beberapa detail tentang apa yang baru di VC10 CTP:

Seperti disebutkan dalam artikel di atas, "Visual C ++ compiler di Microsoft Visual Studio 2010 September Community Technology Preview (CTP) berisi dukungan untuk empat fitur bahasa C ++ 0x, yaitu:"

  • lambdas,
  • mobil,
  • static_assert,
  • rvalue referensi
Michael Burr
sumber
3

Herb Sutter adalah ketua badan standar ISO C ++ dan juga bekerja untuk Microsoft. Saya tidak tahu tentang standar Visual Studio C - terutama karena saya tidak pernah menggunakan C biasa - tetapi Microsoft yakin mencoba untuk mendorong standar C ++ baru ke depan. Bukti ini - seperti yang disebutkan OregonGhost - TR1 yang disertakan dalam Rilis Layanan Visual Studio terbaru.

QBziZ
sumber
1

Visual C ++ Bloq menyediakan banyak informasi tentang beberapa poin menarik terkait dukungan C ++ 11 di VC ++ 11, termasuk beberapa tabel

  • Fitur Bahasa Inti C ++ 11
  • C ++ 11 Fitur Bahasa Inti: Konkurensi
  • C ++ 11 Fitur Bahasa Inti: C99
  • Ukuran Penampung x86 (Bytes)
  • Ukuran Penampung x64 (Byte)

Visual C ++ Team Blog, C ++ 11 Fitur dalam Visual C ++ 11

Pixelchemist
sumber