Hỗ trợ Visual Studio cho các tiêu chuẩn C / C ++ mới?


102

Tôi tiếp tục đọc về C99 và C ++ 11 và tất cả những điều hoàn toàn ngọt ngào này đang được thêm vào tiêu chuẩn ngôn ngữ mà có thể sẽ rất tốt để sử dụng vào một ngày nào đó. Tuy nhiên, chúng tôi hiện đang mòn mỏi trong lĩnh vực viết C ++ trong Visual Studio.

Liệu bất kỳ nội dung mới nào trong tiêu chuẩn sẽ được thêm vào visual studio hay Microsoft quan tâm hơn đến việc thêm các biến thể C # mới để làm điều đó?

Chỉnh sửa: Ngoài câu trả lời được chấp nhận, tôi đã tìm thấy blog của nhóm Visual C ++:

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

Và cụ thể, bài đăng này trong đó:

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

Rất hữu ích. Cảm ơn!


3
Tôi không hiểu bạn tìm thấy điều gì hữu ích trong bài báo 2008/02 từ vcblog vì các tính năng được mô tả ở đó đã tồn tại từ lâu trong boost và khá nổi tiếng. Các tính năng thay đổi thế giới của C ++ 0x là khác nhau: hàm lambda, bộ khởi tạo, v.v. được liệt kê tại en.wikipedia.org/wiki/C%2B%2B0x .
amit

Xem blogs.msdn.com/vcblog/archive/2009/04/22/... bài báo gần đây quá (tôi biết nó là muộn hơn khi câu hỏi được hỏi)
amit

1
Điều này đã được cải thiện rất nhiều trong các phiên bản gần đây của Visual Studio, giống như 2015 Cập nhật 2: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres

Cân nhắc dùng thử MinGW-64
Basile Starynkevitch

Câu trả lời:


103

MS đã có một loạt câu trả lời công khai về điều này, hầu hết trong số họ đổ lỗi cho người dùng của họ. Giống như cái này:

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

Bây giờ, nhóm biên dịch Visual C ++ thỉnh thoảng nhận được câu hỏi là tại sao chúng tôi chưa triển khai C99. Nó thực sự dựa trên sự quan tâm từ người dùng của chúng tôi. Khi chúng tôi nhận được nhiều yêu cầu cho một số tính năng C99 nhất định, chúng tôi đã cố gắng triển khai chúng (hoặc các tính năng tương tự). Một vài ví dụ là macro variadic, long long, __pragma, __FUNCTION__, và __restrict. Nếu có các tính năng C99 khác mà bạn thấy hữu ích trong công việc của mình, hãy cho chúng tôi biết! Chúng tôi không nhận được nhiều thông tin từ người dùng C của mình, vì vậy hãy lên tiếng và tự mình lắng nghe

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

Xin chào: thật không may, phần lớn người dùng của chúng tôi nhận được phản hồi mạnh mẽ là họ muốn chúng tôi tập trung vào C ++ - 0x thay vì C-99. Chúng tôi đã "chọn anh đào" một số tính năng phổ biến nhất định của C-99 (macro đa dạng,long long ) nhưng ngoài điều này, chúng tôi khó có thể làm được nhiều hơn trong không gian C-99 (ít nhất là trong ngắn hạn).

Jonathan Caves

Nhóm biên dịch Visual C ++.

Đây là một trạng thái khá đáng buồn, nhưng cũng có ý nghĩa nếu bạn nghi ngờ MS muốn khóa người dùng: rất khó chuyển mã dựa trên gcc hiện đại vào MSVC, điều mà ít nhất tôi thấy vô cùng đau đớn.

Tuy nhiên, vẫn tồn tại một cách giải quyết: Lưu ý rằng Intel đã sáng suốt hơn nhiều về điều này. trình biên dịch Intel C có thể xử lý mã C99 và thậm chí có các cờ giống như gcc, giúp chuyển mã giữa các nền tảng dễ dàng hơn nhiều. Ngoài ra, trình biên dịch Intel hoạt động trong studio trực quan. Vì vậy, bằng cách loại bỏ MS COMPILER, bạn vẫn có thể sử dụng MS IDE mà bạn dường như nghĩ rằng có một số loại giá trị và sử dụng C99 cho nội dung trái tim của bạn.

Một cách tiếp cận hợp lý hơn là trung thực chuyển sang Intel CC hoặc gcc và sử dụng Eclipse cho môi trường lập trình của bạn. Tính khả chuyển của mã trên Windows-Linux-Solaris-AIX-v.v. theo kinh nghiệm của tôi thường rất quan trọng và điều đó hoàn toàn không được hỗ trợ bởi các công cụ MS.


42
Tuy nhiên, tôi đoán lý do thực sự của họ là chính xác những gì họ đã nói: Cộng đồng C trên Windows có lẽ gần như không tồn tại, hoặc không đáng kể khi so sánh với cộng đồng C ++ / C # /. NET / ASP. Vì vậy, họ có một điểm hợp lệ. Mặc dù tôi có Linux và giống như g ++, tôi sẽ không bỏ MSVC ++ chỉ vì C99, xin lỗi.
paercebal 28-08

11
Nếu ít nhất họ sẽ cung cấp cho chúng ta for (int i ;;) và inline.
Nick Van Brunt


2
Phần tốt nhất trong câu trả lời của họ liên quan đến phát triển theo hướng C ++ 0x là bây giờ, hơn 4 năm sau, họ vẫn hầu như không có bất kỳ hỗ trợ C ++ 11 nào. (Trong khi đó gcc hỗ trợ gần như toàn bộ.)
GManNickG

10
Bản xem trước FWIW, VC2013 hiện đang hỗ trợ các tiêu chuẩn C ++ 11 và C99. Kiểm tra những gì mới cho các nhà phát triển C / C ++ .
con quạ vulcan

37

Herb Sutter vừa là chủ tịch vừa là thành viên tích cực của tổ chức tiêu chuẩn hóa C ++, đồng thời là kiến ​​trúc sư phần mềm trên Visual Studio cho Microsoft.

Ông là một trong những tác giả của mô hình bộ nhớ C ++ mới được chuẩn hóa cho C ++ 0x. Ví dụ, các giấy tờ sau:

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

có tên của mình trên đó. Vì vậy, tôi đoán việc đưa vào Windows C ++ 0x được đảm bảo miễn là H. Sutter vẫn ở lại Microsoft.

Đối với C99 chỉ có một phần trong Visual Studio, tôi đoán đây là một câu hỏi về mức độ ưu tiên.

  • Hầu hết các tính năng thú vị của C99 đã có trong C ++ (nội tuyến, khai báo biến ở bất kỳ đâu, // nhận xét, v.v.) và có thể đã sử dụng được trong C trong Visual Studio (Nếu chỉ thực hiện mã C trong trình biên dịch C ++). Xem câu trả lời của tôi ở đây để có một cuộc thảo luận đầy đủ hơn về các tính năng của C99 trong C ++.
  • C99 làm tăng sự khác biệt giữa C và C ++ bằng cách thêm các tính năng đã có trong C ++, nhưng theo cách không tương thích (xin lỗi, nhưng việc triển khai phức hợp boolean trong C99 thật nực cười, tốt nhất là ... Xem http://david.tribble.com/ text / cdiffs.htm để biết thêm thông tin)
  • Cộng đồng C trên Windows dường như không tồn tại hoặc không đủ quan trọng để được thừa nhận
  • Cộng đồng C ++ trên Windows dường như quá quan trọng nên bị bỏ qua
  • .NET là cách mà Microsoft muốn mọi người lập trình trên Windows. Điều này có nghĩa là C #, VB.NET, có lẽ là C ++ / CLI.

Vì vậy, tôi là Microsoft, tại sao tôi lại triển khai các tính năng mà ít người sẽ sử dụng khi các tính năng tương tự đã được cung cấp bằng nhiều ngôn ngữ hoạt động cộng đồng hơn đã được hầu hết mọi người sử dụng?

Phần kết luận?

C ++ 0x sẽ được bao gồm, như là phần mở rộng của VS 2008 hoặc trên thế hệ tiếp theo (thế hệ?) Của Visual Studio.

Các tính năng C99 chưa được triển khai sẽ không có trong những năm tới, trừ khi có điều gì đó kịch tính xảy ra (một quốc gia đầy rẫy các nhà phát triển C99 xuất hiện từ đâu?)

Chỉnh sửa 2011-04-14

Rõ ràng, "quốc gia đầy rẫy những nhà phát triển C99" đã tồn tại: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Tuy nhiên, nhận xét cuối cùng tại: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 , tôi đoán là đủ rõ ràng.

Chỉnh sửa 2012-05-03

Herb Sutter đã nói rõ rằng:

  1. Mục tiêu chính của chúng tôi là hỗ trợ "hầu hết C99 / C11 là tập con của ISO C ++ 98 / C ++ 11."
  2. Chúng tôi cũng vì lý do lịch sử cung cấp trình biên dịch C90 chấp nhận (chỉ) C90 chứ không phải C ++
  3. Chúng tôi không có kế hoạch hỗ trợ các tính năng ISO C không thuộc C90 hoặc ISO C ++.

Bài đăng trên blog thêm liên kết và giải thích thêm cho những quyết định đó.

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


1
Công bằng mà nói - việc triển khai boolean trong C99 đã được thực hiện để cho phép tương thích ngược với mã sane (tức là mã xác định bool có boolean).
Maciej Piechotka

19
Điều này: "Hầu hết các tính năng C99 thú vị đã có trong C ++" chỉ là sai. Định dạng dấu phẩy động thập lục phân và các ký tự. Thư viện toán học C99 hàm. Trình khởi tạo được đặt tên cho cấu trúc / liên hiệp. Các restricttừ khóa. Có rất nhiều tính năng tuyệt vời của C99 bị thiếu trong C ++ và chúng là những tính năng mà tôi sử dụng hàng ngày với tư cách là một lập trình viên C.
Stephen Canon

1
@Stephen Canon: Vui lòng đọc câu trả lời của tôi tại: stackoverflow.com/questions/3879636/… . Tất nhiên, đây là câu trả lời C ++ cho các nhà phát triển C ++, vì vậy nó không phù hợp cho các nhà phát triển C không muốn sử dụng các lớp, hàm tạo hoặc các hàm toán học quá tải (ai cần tgmath.h trong C ++?). Vấn đề là: Những gì quan trọng đã có, hoặc dễ thực hiện. Đối với restricttừ khóa, bạn vẫn có thể sử dụng trong C ++, rõ ràng là: stackoverflow.com/questions/776283/… . . .
paercebal

5
@paercebal: bạn có quyền quan điểm đó, nhưng không có gì trong C ++ có thể khiến tôi từ bỏ các ký tự dấu phẩy động thập lục phân. Đây chính là quan điểm của tôi. Tất nhiên các lập trình viên C ++ không quan tâm đến các tính năng của C99; đó có lẽ là lý do tại sao họ là lập trình viên C ++. Ngược lại, có cả một thế giới lập trình viên C ngoài kia không quan tâm chút nào đến các tính năng của C ++ và chỉ muốn Microsoft cung cấp một trình biên dịch C ít nhất cố gắng tuân thủ tiêu chuẩn như mọi người khác.
Stephen Canon

13
@paercebal: "tương đương" là vô dụng. Có hàng triệu dòng mã C di động hoạt động tốt trên mọi nền tảng khác. Bạn có gợi ý rằng chúng được viết lại không? Cộng đồng người dùng C99 đủ lớn để mọi nhà cung cấp trình biên dịch lớn khác ít nhất cố gắng cung cấp khả năng tương thích: IBM, HP, Apple, Intel, GNU, Sun, ARM, vô số trình biên dịch thiết bị nhúng, v.v. C99 có thể không quan trọng đối với các lập trình viên Windows , nhưng các chương trình Windows đại diện cho một phần nhỏ trong tổng số mã được viết.
Stephen Canon

11

Bắt đầu từ bản xem trước VC2013 1 , C99, một bộ C ++ 11 đa dạng hơn và một số tiêu chuẩn C ++ 14 mới được giới thiệu được hỗ trợ. Kiểm tra blog chính thức để biết thêm chi tiết: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Cập nhật:

Từ https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej hay còn gọi là: STL là người duy trì nhóm STL @VC):

Cụ thể, vào năm 2015, việc triển khai Thư viện tiêu chuẩn C99 của chúng tôi đã hoàn tất, ngoại trừ tgmath.h (không liên quan trong C ++) và macro pragma CX_LIMITED_RANGE / FP_CONTRACT.

Kiểm tra bài đăng này để biết chi tiết: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .


Chỉ hỗ trợ một phần cho C99 theo như tôi có thể cho biết: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Chúng tôi biết rằng đây không phải là hỗ trợ đầy đủ cho các chức năng của thư viện C99."
sdfqwerqaz1

@ sdfqwerqaz1, hãy xem nhận xét từ STL tại đây : "nhóm biên dịch và thư viện sẽ xem xét chúng theo từng trường hợp cụ thể, nhưng ưu tiên chính của chúng tôi là tuân thủ C ++. Ví dụ: vì C ++ 11/14 kết hợp Tiêu chuẩn C99 Thư viện tham khảo, Bản xem trước 2015 hỗ trợ đầy đủ Thư viện chuẩn C99 (với thiếu sót duy nhất là tgmath.h, yêu cầu phép trình biên dịch C và không liên quan đến C ++ có quá tải và CX_LIMITED_RANGE / FP_CONTRACT cũng yêu cầu hỗ trợ trình biên dịch) " .
quạ vulcan

8

Tôi đã tham gia vào công việc ISO C ++ (2000-2005) và Microsoft đã có những đóng góp đáng kể cho ngôn ngữ đó. Không nghi ngờ gì nữa, chúng sẽ hoạt động trên C ++ 0x, nhưng chúng sẽ cần thêm một chút thời gian so với Intel. Micosoft phải đối phó với một cơ sở mã lớn hơn thường sử dụng các phần mở rộng độc quyền của họ. Điều này chỉ đơn giản là làm cho một testfase dài hơn. Tuy nhiên, cuối cùng họ sẽ hỗ trợ hầu hết C ++ 0x (mặc dù xuất khẩu vẫn không được yêu thích, hoặc tôi hiểu).

Khi nói đến ISO C, những người làm việc về tiêu chuẩn không phải là đại diện cho thị trường Microsofts. Khách hàng của Microsofts có thể sử dụng C ++ 98 nếu họ chỉ đang tìm kiếm một C. Vậy tại sao Microsoft lại chi tiền cho C99? Chắc chắn, các bộ phận do Microsoft chọn, nhưng đó là công việc kinh doanh lành mạnh. Dù sao thì họ cũng cần những thứ đó cho C ++ 0x, vậy tại sao phải đợi?


7

Hỗ trợ MSVC cho C rất tiếc là rất thiếu. Nó chỉ hỗ trợ phần C99 là một tập hợp con của C ++ ... có nghĩa là, chẳng hạn, về mặt vật lý, không thể biên dịch thư viện ffmpeg hoặc libav * của nó trong MSVC, vì chúng sử dụng nhiều tính năng của C99 như các phần tử struct được đặt tên. Điều này còn tệ hơn do libavcodec cũng yêu cầu một trình biên dịch duy trì sự liên kết ngăn xếp, điều này MSVC thì không.

Tôi làm việc trên x264, mà ffmpeg không giống như không thực hiện một nỗ lực để hỗ trợ MSVC, mặc dù làm như vậy thường là một cơn ác mộng trong và của chính nó. Nó không duy trì căn chỉnh ngăn xếp ngay cả khi bạn chuyển lệnh gọi hàm cao nhất một cách rõ ràng thông qua một hàm căn chỉnh ngăn xếp dựa trên hợp ngữ rõ ràng, vì vậy tất cả các hàm yêu cầu ngăn xếp được căn chỉnh phải bị vô hiệu hóa. Nó cũng rất khó chịu là tôi cũng không thể sử dụng các vararrays; có lẽ điều này là tốt nhất, vì rõ ràng GCC đã khiến họ bi quan về hiệu suất một cách ồ ạt.



4

Microsoft chưa bao giờ thể hiện bất kỳ mối quan tâm thực sự nào đến việc cập nhật tốc độ với tiêu chuẩn c99 (hiện đã trở nên cũ kỹ). Thật đáng buồn cho các lập trình viên C, nhưng tôi nghi ngờ rằng Microsoft quan tâm nhiều hơn đến cộng đồng C ++.


4

Visual C ++ 2008 SP1 chứa ít nhất các phần của TR1 và đôi khi, nhóm Visual C ++ đang viết blog hoặc nói về C ++ 0x, vì vậy tôi đoán họ sẽ hỗ trợ nó vào một lúc nào đó trong tính năng này. Tôi không đọc bất cứ điều gì chính thức mặc dù.


4

Thông tin cập nhật về điều này:

Hiện tại (ngày 10 tháng 11 năm 2008) đã có "Bản xem trước công nghệ cộng đồng" (CTP) của VS2010 chứa bản xem trước của VC10 có một số phần của C ++ 0x được triển khai (lưu ý rằng VC10 sẽ không có bộ C ++ 0x đầy đủ các thay đổi được triển khai ngay cả khi VC10 được phát hành):

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

Một số chi tiết về tính năng mới trong VC10 CTP:

Như đã lưu ý trong bài viết trên, "Trình biên dịch Visual C ++ trong Microsoft Visual Studio 2010 September Community Technology Preview (CTP) có hỗ trợ bốn tính năng ngôn ngữ C ++ 0x, cụ thể là:"

  • lambdas,
  • Tự động,
  • static_assert,
  • tham chiếu rvalue

3

Herb Sutter là chủ tịch của cơ quan tiêu chuẩn ISO C ++ và cũng làm việc cho Microsoft. Tôi không biết về tiêu chuẩn Visual Studio C - chủ yếu là vì tôi không bao giờ sử dụng C thuần túy - nhưng Microsoft chắc chắn đang cố gắng thúc đẩy tiêu chuẩn C ++ mới về phía trước. Bằng chứng về điều này là - giống như OregonGhost đã đề cập - TR1 được bao gồm trong Bản phát hành dịch vụ Visual Studio mới nhất.


3

Nhóm Visual C ++ đã đưa ra một bảng các tính năng C ++ 0x mà bản phát hành 2010 hỗ trợ tại http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language -features-in-vc10-the-table.aspx . Vì có thể có một khoảng thời gian trễ giữa thông số kỹ thuật và việc triển khai, điều đó có vẻ khá hợp lý. Wikipedia có một bài viết hay về thông số kỹ thuật. Nó vẫn chưa kết thúc vào lúc tôi đang viết cái này.


1

Visual C ++ Bloq cung cấp rất nhiều thông tin về một số điểm liên quan đến việc hỗ trợ C ++ 11 trong VC ++ 11, bao gồm một số bảng

  • Các tính năng ngôn ngữ cốt lõi của C ++ 11
  • Các tính năng ngôn ngữ cốt lõi của C ++ 11: Đồng thời
  • Các tính năng ngôn ngữ cốt lõi của C ++ 11: C99
  • Kích thước vùng chứa x86 (Byte)
  • Kích thước vùng chứa x64 (Byte)

Blog của Nhóm Visual C ++, C ++ 11 Các tính năng trong Visual C ++ 11

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.