2017-02-04 54 views
2

我想要獲得上述短語的一般意義。我正在學習PyGame,並遇到了SDL(Simple DirectMedia Layer)參考。SDL:「在C++中本地工作」是什麼意思?

從PyGame引用SDL:「Pygame是SDL的python包裝器,由Pete Shinners編寫。」 http://www.pygame.org/docs/tut/newbieguide.html

我擡頭SDL(在上面的URL鏈接SDL [只需點擊SDL]),並跑進 「SDL是用C寫的,用C工作本身++,...」 在這裏:http://libsdl.org/

我有認爲「本地」這個詞暗示了原始環境,但我不明白爲什麼用C編寫的東西不是C語言本身的,而是C++中的本地語言?

這句話是否意味着它在C++中的工作原理?

回答

6

SDL是用C語言編寫的,與C++本身一起工作,並且還有其他幾種語言的綁定,包括C#和Python。

我想你可以拿走本聲明如下:

  • SDL是用C寫因此,你可以直接從你的C程序中調用它。
  • C++「被設計爲與C編譯器兼容的源和鏈接」1因此,您可以在您的C++程序中「自然地」使用SDL,這意味着不需要翻譯/編組層。您可以簡單地使用#include頭文件,並直接調用API。
  • 其他語言(如C#和Python)本身不能調用C API,並且需要修改參數。這個編組完成在language binding
1

儘管語言之間有很多相似之處,但C和C++不是同一種語言,並且在C++編譯器中使用C編譯器時,有一些地方不能編譯C代碼。

一個這樣的示例是這樣的:

int main() 
{ 
    void *vptr; 
    int *iptr = vptr; 
    return 0; 
} 

在C中,這個代碼將編譯。在C++中,這是非法的代碼,並且必須被改寫爲

int main() 
{ 
    void *vptr; 
    int *iptr = (int*)vptr; 
    return 0; 
} 

這個例子,和許多人一樣,可以在這裏找到:http://www.geeksforgeeks.org/write-c-program-wont-compiler-c/

當你的Python SDL的SDK表明(... OY)。它是用C語言編寫的,並且在C++中原生地工作,這幾乎可以肯定地表明沒有像我之前引用的代碼那樣的例子。

1

就編程語言而言,C++和C享有特別好的鏈接時間關係。用任何一種語言編寫的函數都可以從其他語言的代碼中調用(只要所有代碼都使用一致的工具鏈編譯),並且這兩種語言共享一組「通用」的基本類型,即「意思相同」。

爲了說明,考慮一個簡單的庫函數foo取一個整數並返回一個整數。首先,我們可以寫一個頭文件,它是有效的在兩種語言:

lib.h:

#ifndef H_FOO 
#define H_FOO 

#ifdef __cplusplus 
extern "C" { 
#endif 

int foo(int); 

#ifdef __cplusplus 
} // extern "C" 
#endif 

#endif // H_FOO 

接下來,我們可以提供一個實現此功能的C代碼:

lib_impl .C:

#include "foo.h" 

int foo(int a) { /* ... */ }; 

最後,我們可以從C++消耗這個庫:

app.cpp:

#include "foo.h" 

struct XYZ { 
    XYZ(int n) : data_(foo(n)) {} 
private: 
    int data_; 
}; 

int main() { XYZ(10); } 

在鏈接時,在app.cpp翻譯單元的外部符號foo可以從lib_impl.c翻譯單元導出的符號foo匹配,即使它們是從編譯不同的語言。類型int在兩種語言中表示「相同」,這意味着在C++中使用值10調用該函數會導致正確的調用,就好像C代碼使用參數10調用該函數一樣 - int類型的表示方式相同,並且兩種語言的調用約定都是相同的。

C和C++的這個基本方面不是任何形式標準的一部分,但是實際上是普遍真實的,它是核心兼容性特性之一,它允許新的C++程序基於大量現有代碼進行構建,以及交互「本地」與許多操作系統API(通常提供爲C API)。

許多工具鏈提供了類似的鏈接時間互操作性,其中彙編代碼中寫入了目標代碼(需要密切關注相關調用約定),Fortran也很常見(儘管您需要匹配C和Fortran類型的C++基本類型)。其他更新的語言也可以提供與C的「直接」互連性(因此,以迂迴的方式,用C++和Fortran),否則它們可能需要更多的庫重「外部函數接口」,這是一種有關它如何提名由外語提供的功能(例如Java和Go)的詳細信息。