visual studio為什麼把很多posix函數標記為deprecated?
比如posix的open函數,
被標記為不標準(NONSTDC)建議使用標準的_open,並且聲稱open不標準,_open才是c++ standard,根本就沒聽說c++標準有這種東西。
然而_open又繼續被標記為不安全的(INSECURE),推薦使用_s_open。不安全的理由據說是沒有返回錯誤碼,
但是發現返回值不對,檢查errno不就行了?這麼做有什麼理由么?反而給移植添了很多亂。弄得程序裡面一堆噁心的#ifdef
補充一些:實際上這些函數windows也帶了,如果關閉這些警告,強行使用posix函數使用會怎麼樣?
Windows並不百分百兼容POSIX,如open這是POSIX函數,所以其實不應該期盼在Windows可以編譯運行。POSIX標準並不是ISO C, ISO C++標準。Windows提供了一套類似功能的介面,但是使用了_開頭的函數來表示,如open表示為_open。而C++標準規定了在全局命名空間的_有特殊的含義:
5.10.3.2
Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
所以Visual Studio這樣報信息也是沒有問題的,是符合ISO C++標準的。
至於加上_s,這個標準沒有規定,只是Visual Studio建議,它做了更安全的一個版本出來。
你要是想移植,就不要寫非標準的代碼
為什麼一定要假定你要移植的平台支持posix
你要寫跨平台程序就別用POSIX API,這點常識還用科普么?
POSIX是一部分操作系統的標準,並不是C、C++語言的標準。
在msvc里使用「原版」posix函數,可能會遇到緩衝區溢出。
POSIX、glibc本來就不是C或C++標準的成員。如果真想兼容msvc,請為項目引入mingw。或者改用其他編譯器。
(微軟已經砍掉了Windows Services for UNIX項目,現在他們只推薦Windows Subsystem for Linux。)
可以自己做一堆定義出一個兼容層來用.編譯的時候靠宏來選擇使用什麼樣的函數.
因為POSIX本身就不是標準。
因為緩衝區溢出在操作系統層面一直都是嚴重的安全問題。
還要什麼為什麼?
多虧有你這種強行用非標準不安全函數的程序員,才會有那麼多緩衝區溢出的風險。這都17年了……
你嫌_s噁心?當發生緩衝區溢出時候你會更噁心。(不特指open還有很多函數有_s,大學時期改過別人這種bug)再說了你不能強行要求msvc支持POSIX啊,畢竟這不是標準。如果想跨平台使用可以試試c++的庫(雖然很多庫里也有坑)
推薦閱讀:
※長期用 C++ 和 MATLAB 做機器學習的你,有沒有遇到一個讓你相見恨晚的語言或包?
※devcpp的ascii碼輸出字元時為什麼和ascii碼錶上的字元不同?
※在C++11中,如何將一種編碼的string轉換為另一種編碼的string?
※如何將一個函數編譯成二進位文件?
※微軟對 C++ 的影響力有多大?
TAG:MicrosoftVisualStudio | CC | POSIX |