![](/img/trans.png)
[英]are C functions declared in <c____> headers guaranteed to be in the global namespace as well as std?
[英]When using C headers in C++, should we use functions from std:: or the global namespace?
C在某種程度上並不完全是C ++的一個子集。 因此,我們可以通過稍微更改名稱( stdio.h
到cstdio
, stdlib.h
到cstdlib
)來使用C ++中的大多數C函數/頭文件。
我的問題實際上是一種語義。 在C ++代碼中(使用最新版本的GCC編譯器),我可以調用printf("Hello world!");
和std::printf("Hello world!");
它的工作方式完全相同。 在我使用它的參考中它也顯示為std::printf("Hello world!");
。
我的問題是,是否首選使用std::printf();
在C ++中? 有區別嗎?
從C ++ 11標准(強調我的):
D.5 C標准庫頭文件[depr.c.headers]
- 為了與C標准庫兼容......
- 每個C頭(每個頭都具有name.h形式的名稱)的行為就好像每個由相應的cname頭放置在標准庫命名空間中的名稱放在全局命名空間范圍內。 它是不確定的這些名字是否首先聲明或空間std 的 命名空間范圍 (3.3.6) 中定義 ,然后通過使用明確的-聲明(7.3.3)注入到全局命名空間范圍。
- 示例:標頭
<cstdlib>
確定 在命名空間std
提供其聲明和定義。 它還可以在全局命名空間中提供這些名稱。 頭文件<stdlib.h>
肯定 在全局命名空間中提供相同的聲明和定義,就像在C標准中一樣。 它還可以在命名空間std
提供這些名稱。
不推薦使用«name.h»標頭,它們已被確定為從未來版本中刪除的候選者。
因此,我建議包含«cname»標頭並使用std
命名空間中的聲明和定義。
如果由於某些原因必須使用«name.h»頭文件(不推薦使用,請參見上文),我建議使用全局命名空間中的聲明和定義。
換句話說:更喜歡
#include <cstdio>
int main() {
std::printf("Hello world\n");
}
過度
#include <stdio.h>
int main() {
printf("Hello world\n");
}
<cmeow>
始終提供::std::purr
,可能會也可能不會提供::purr
。
<meow.h>
總是提供::purr
,可能會也可能不會提供::std::purr
。
使用保證由您包含的標題提供的表單。
不,你也沒關系。
最初的意圖是<___.h>
標題是將所有內容放在全局名稱空間中的C版本,而<c___>
標題將是C ++ - ified版本,它將所有內容放在std
名稱空間中。
但實際上,C ++版本還將所有內容都放入了全局命名空間。 並且沒有明確的共識,使用std::
版本是“正確的事情”。
所以基本上,使用你喜歡的任何一個。 最常見的可能是在全局命名空間中使用C標准庫函數( printf
而不是std::printf
),但沒有太多理由認為一個“更好”而不是另一個。
唯一的區別是在std::printf()
通過添加std::
scope解決方案,您將保護自己免於將來編寫具有相同名稱的函數的人,這將導致名稱空間沖突。 兩種用法都將導致完全相同的OS API調用(您可以通過運行strace your_program
在Linux下進行檢查)。
我發現有人不太可能命名這樣的函數,因為printf()
是最常用的函數之一。 此外,在C ++中, iostream
s優先於對cstdio
等cstdio
函數的調用。
從C ++ 11標准:
每個C頭(每個頭都具有name.h形式的名稱)的行為就好像每個由相應的cname頭放置在標准庫命名空間中的名稱放在全局命名空間范圍內。 未指定是在名稱空間std的名稱空間作用域(3.3.6)中首先聲明或定義這些名稱,然后通過顯式使用聲明(7.3.3)將這些名稱注入全局名稱空間作用域。
因此,如果您使用<cstdio>
,您可以確定, printf
將位於namespace std
,因此不在全局命名空間中。
使用全局命名空間會產生名稱沖突。 這不是C ++方式。
因此,我正在使用<cstdio>
標題並建議您這樣做。
從我自己的實踐:使用std::
前綴。 否則1天abs
你會使用浮動點咬你非常痛苦的情況。
非限定abs
指的是某些平台上int
上定義的函數。 在其他人身上它超載了。 但是,對於所有類型, std::abs
總是重載。
僅使用printf
而不使用std::
會產生一些名稱沖突,並被很多c ++開發者認為是一種不好的做法。 谷歌是你的朋友,但這里有一些鏈接,希望這會有所幫助
為什么“使用命名空間std”被認為是不好的做法? http://www.cplusplus.com/forum/beginner/61121/
在stdio
這是標准C庫頭文件@c stdio.h的C ++版本,其內容(大部分)與該頭文件相同,但都包含在命名空間@c std中(除了名稱中定義為宏的名稱) C)。
所以它應該沒有任何區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.