簡體   English   中英

傳統的標准C庫頭文件和重載的C ++函數

[英]Legacy standard C library headers and overloaded C++ functions

C ++語言標准在D.5中

2每個C標頭(每個標頭都具有name.h形式的名稱)的行為就好像每個由相應的cname標頭放置在標准庫命名空間中的名稱放在全局命名空間范圍內。 未指定是在名稱空間std的名稱空間作用域(3.3.6)中首先聲明或定義這些名稱,然后通過顯式使用聲明(7.3.3)將這些名稱注入全局名稱空間作用域。

3 [示例:標頭<cstdlib>確定在命名空間std提供其聲明和定義。 它還可以在全局命名空間中提供這些名稱。 頭文件<stdlib.h>肯定在全局命名空間中提供相同的聲明和定義,就像在C標准中一樣。 它還可以在命名空間std提供這些名稱。 - 末端的例子]

這似乎相當明確地說明了(“......每個名字......”,“......相同的聲明......”)舊式<name.h>標題必須提供<name.h>相同的聲明集。新式<cname>標頭,但在全局命名空間中。 例如,對於各種C函數的C ++特定重載版本,沒有例外。

這似乎意味着<math.h>必須在全局命名空間中提供三種版本的sin函數: sin(float)sin(double)sin(long double) 反過來,這意味着以下C ++代碼應該無法解決重載問題

#include <math.h>

int main() {
  sin(1);
}

它在MSVC ++編譯器下失敗,但它在GCC和Clang下成功編譯。 那么,GCC是否只是忽略了已棄用的舊式標題的標准要求? 或者我在某種程度上誤解了標准中的措辭?

感謝@ hvd的評論我已經看到了光,結果證明MSVC是正確的,GCC也應該抱怨模糊性。

包含<cmath> vs <math.h>之間的唯一區別是名稱最初作用域的位置,在前者的namespace std中,以及后者的全局名稱空間(實現可以在其他名稱空間中自由提供名稱)同樣,但這不是強制性的),並且不推薦使用包含C標頭的.h變體的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM