2014-12-29 61 views
3

我以前編寫的C++代碼是#include的Unix和Linux API頭文件,並且這些程序產生了預期的行爲。這就是說,我不知道這是否可以依靠。 C和C++之間的不兼容可能會導致有效的C頭在被C++程序使用時以意想不到的方式工作。Unix和Linux API標頭是否與C++兼容?

Unix和Linux API頭可以被編譯爲C++的代碼可靠地使用嗎?

這是這些標題作者的目標嗎?或者這些標題僅僅是有效的C?

這樣做時是否有任何已知的陷阱?

很顯然,Unix和Linux發行版很多,我不期待一個接一個地回答每個發行版的問題。我的期望是,同樣的答案將適用於幾乎所有的Unix和Linux發行版,例外將證明這一規則。如果這個假設是錯誤的,那麼對此的解釋也是一個有效的答案。

由Unix頭我的意思是這些:

http://www.unix.org/version3/apis/headers.html

通過Linux頭我的意思是通過Linux發行版提供通常爲一個名爲「Linux的頭」允許程序與Linux內核交互包的報頭。例如,這Debian軟件包:

https://packages.debian.org/wheezy/kernel/linux-headers-3.2.0-4-amd64

我意識到Unix的鏈接只是一個規範,並且每個Linux發行版是不同的,但我又懷疑這是合理的,問這個問題的最分佈。如果那不是真的,那麼糾正我。

編輯我只是指用戶空間程序使用的標題。

+3

你是什麼UNIX和Linux頭意味着 – redFIVE

+1

嗯,我發現自己的情況,我必須包括C++頭第一(像''),然後包括平臺特定的頭文件(比如'')。當夾雜物受到尊重時,編譯將失敗。 (或者情況反之亦然)。 – jww

+0

@redFIVE編輯。那是你在找什麼?我認爲「unix標題」是一個合理的描述,所以我可能不明白的東西。是「Unix和Linux」令人困惑嗎? – Praxeolitic

回答

5

C標準頭像<stdio.h><stdlib.h>,等被在附錄d指定C++標準,其中聲明:

這些建議使用的功能,其中棄用定義爲: 規範的標準的當前版本,但不能保證 是在將來的版本的標準的一部分。

非棄用C++標準C頭文件的版本都有名字,像<cstdio><cstdlib>等,他們在技術上把自己定義爲std(不是全球)命名空間。因此,爲符合100%,與C++規範的非過時的部分,你需要寫這樣的事:

#include <cstdio> 

int main() { 
    std::printf("Hello, world!\n"); 
} 

不過,據我所知,沒有現成的實現實際上迫使你這樣做,在我看來,這是不可能的。因此,在實踐中,您可以放心地使用C++中的C標準頭文件。另外,如果您使用的是POSIX系統,您通常可以同樣安全地使用C++的POSIX功能。當然,沒有人會故意破壞這一切,因爲用戶會反抗。

但是,當混合範例時,意外破損是可以想象的。如果平臺和語言標準都提供某種功能,則應使用其中一種,但不能同時使用其中一種。特別是,我不會將POSIX線程和同步機制與標準C++ 11線程和同步機制混合在一起,因爲很容易想象優化程序對後者瞭解太多並生成與前者不兼容的代碼。

[更新,在一定程度上詳細]

<unistd.h>是什麼。我是指依賴於平臺的功能的示例。它通常可以在C++下正常工作,圖書館和編譯器開發人員都不會因此而無法打破它,因爲這太煩人了。所以繼續打電話getpid()pipe()或其他什麼。

但請注意,混合範式引發各種問題。僅舉幾例我的頭頂:

  • 你可以從信號處理程序調用new嗎?
  • 您可以使用dup2加上描述符0來重定向cin
  • 在靜態初始化過程中(即執行main之前)可以安全地調用哪些POSIX函數?

這些問題和其他人喜歡他們沒有處理任何規範。答案取決於您的具體實施,並可能在不同版本之間進行更改

說了這麼多......幾乎每個非平凡的C++程序都依賴於某些C接口公開的特定於平臺的功能。所以你所描述的在實踐中可以很好地工作,只要你(a)有一些想法「發動機罩下」正在發生什麼; (b)有合理的期望; (c)不要試圖混合使用標準和平臺特定的範例。

+0

C標準庫頭文件確實包含在頭文件的Open Group要求中,但我記住的頭文件是C++標準中未提及的頭文件,例如, 'unistd.h'。 – Praxeolitic

+0

@Praxeolitic:'unistd.h'就是我在前兩段中所說的例子。另請參閱我剛剛添加的更新。 – Nemo

1

1)是:「標準頭」是標準。無論平臺如何,您都可以安全使用它們。 2)是:您可以在同一個C++翻譯單元中混合使用C頭(例如<stdio.h>)和C++頭(例如<iostream>)。

3)NO:你不應使用linux內核頭在用戶模式下的程序,反之亦然。

Linux內核頭文件用於內核模式驅動程序,而不是用於「普通」用戶空間應用程序。

這裏是一個位的更多信息:

+1

從C++標準的角度來看,Unix和Linux頭文件並不是標準的。 'stdio.h'被C++標準覆蓋。你能找到1)的來源嗎?我認爲我應該使用的這句話是「Linux API標題」。這是否更有意義? – Praxeolitic

+0

只是不要將「kernel/linux-headers-3.2.0-4-amd64」這樣的頭文件與/ usr/include中的頭文件(比如「stdio.h」)混爲一談。後者用於用戶空間程序;前者用於內核模塊等。這是我的要點...... – FoggyDay