2012-03-27 36 views
6

我移植一個Windows庫到Android(與GNU標準C++庫選項,的libstdC++ - v3)和那裏似乎是VC和GNU庫之間的許多命名的差異,例如:爲什麼Windows和Linux之間的標準庫函數名稱不同?

  • _stricmp被稱爲strcasecmp而不是
  • _unlink被稱爲unlink
  • _scalb被稱爲scalbn
  • _finite被稱爲isfinite
  • _isnan被稱爲isnan
  • _itoaitoa似乎並沒有在GNU C++存在
  • atoi確實存在,但不是atoi64

兩個VC和GNU庫的文檔意味着他們實施「ISO 「例如,我可以從VC2008中獲得一些警告,不使用」ISO C++「名稱,例如:」警告C4996:'itoa':不推薦使用此項目的POSIX名稱。相反,使用ISO C++一致性名稱:_itoa。「同樣,GNU的手冊中說」GNU標準C++庫v3是一個正在進行的項目,用於實現ISO 14882標準C++庫「

那麼庫如何結束?不同的名字,我怎麼知道哪個名字更「標準」

此外,有沒有一個指數的libstdC++ - V3的任何地方,即庫中的所有功能,一個簡單的列表,我只能找到一個manual和「source documentation」,它似乎沒有提供功能列表。

+8

其中有幾個不在C++標準庫中,所以在這些情況下,都不是「標準」。 – 2012-03-27 19:37:26

+2

微軟正在試圖通過將其非標準功能命名爲前導下劃線來保持一致。 – 2012-03-27 19:46:14

+1

MSVC中的'_atoi64'在GCC中被稱爲'atoll'。 – dan04 2012-03-29 23:35:30

回答

12

這與C++很少有關標準庫。它與C99和POSIX有關。

  • strcasecmp是libstdC++恰好實現的POSIX函數。 msvcrt通常與POSIX保持一定的距離。
  • unlink是類似的 - 這是一個POSIX函數。
  • scalbn是C99標準中函數的名稱。 MSVC不支持C99。然而,scalbn是C++ 11的一部分,所以我希望它最終在msvcrt中顯示。
  • isfiniteisnan都是C99。
  • itoa既不是C99也不是POSIX。這是一個奇怪的野獸,只是在晚上出現。

我還會指出其他幾個人指出的:在標準庫中的任何函數的前綴在技術上更正確,實際上它們是非標準的,並帶有下劃線。這就是msvcrt下劃線擴散的原因。

+0

所以下劃線表示「編譯器特定」。謝謝,還有一件事:你是否隨着時間的推移學習了這些東西,還是有一種簡單的方法來確定是否有任何給定的函數是POSIX,C99,C++ 11中的新增功能等等?同時使用POSIX和C/C++標準中的任何函數嗎? – Qwertie 2012-03-27 20:11:12

+0

我想所有由MSVC實現的POSIX方法都有一個下劃線,而所有由GNU實現的POSIX方法都沒有下劃線。我需要爲我的代碼定義一個通用名稱,因此,你認爲最好是在通用名稱中使用下劃線(「#ifdef LINUX int _unlink(const char * p){...}」 )或不是(「#ifdef WIN32 int unlink(const char * p){...}」)? – Qwertie 2012-03-27 20:18:58

+0

哦,並且 - 對不起,我一直在想更多的問題 - 在Windows和Linux中是否有可用的替代名稱?例如,不是POSIX unlink()或C99 scalbn(),是否有ISO標準C++函數用於刪除文件或將某些內容添加到浮點數上的指數上?還是沒有辦法編寫真正的可移植的C++代碼? – Qwertie 2012-03-27 20:31:07

1

我想任何實現可調用其執行「ISO標準」,如果他們預先準備_的函數名和爲所欲爲,因爲這些標識符是保證將保留通過標準的實施。但他們也不能保證便攜。

2

它們都不是標準的。該標準確實表示不應該添加名稱,但這是警告實際上的含義。下劃線使它們符合標準,因爲它們不會在標準C/C++中混淆。

它們意味着通過添加下劃線,您的代碼將使用標準中的某些內容,但都不是版本。

相關問題