[英]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.