簡體   English   中英

在C ++中使用C頭時,我們應該使用std ::或全局命名空間中的函數嗎?

[英]When using C headers in C++, should we use functions from std:: or the global namespace?

C在某種程度上並不完全是C ++的一個子集。 因此,我們可以通過稍微更改名稱( stdio.hcstdiostdlib.hcstdlib )來使用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]

  1. 為了與C標准庫兼容......
  2. 每個C頭(每個頭都具有name.h形式的名稱)的行為就好像每個由相應的cname頭放置在標准庫命名空間中的名稱放在全局命名空間范圍內。 它是不確定的這些名字是否首先聲明或空間std 命名空間范圍 (3.3.6) 中定義 ,然后通過使用明確的-聲明(7.3.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優先於對cstdiocstdio函數的調用。

從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.

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