2017-02-04 11 views
2

私は上記のフレーズの一般的な意味を得ようとしています。私はPyGameを学び、SDL(Simple DirectMedia Layer)のリファレンスに遭遇しました。SDL:「C++でネイティブに動作する」とはどういう意味ですか?

PyGameのSDLへの参照:「Pygameは、Pete Shinnersによって書かれたSDLのPythonラッパーです。」 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コードがコンパイルされない領域がいくつかあります。

その一例は次のようになります

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は、プログラミング言語が行なわれる限り、特に優れたリンク時の関係を享受します。いずれかの言語で書かれた関数は、(すべてのコードが一貫したツールチェーンでコンパイルされていれば)他の言語のコードから呼び出すことができ、2つの言語は「同じ意味」の共通の基本型を共有します。

説明のために、単純なライブラリ関数fooを考えて、整数を返し、整数を返します。まず、我々は両方の言語で有効なヘッダファイルを書くことができます。

lib.h:

lib_impl:

#ifndef H_FOO 
#define H_FOO 

#ifdef __cplusplus 
extern "C" { 
#endif 

int foo(int); 

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

#endif // H_FOO 

次へ]を、私たちはこの機能を実装するCコードを提供することができます.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でもよくありますFortranの型を持つC++基本型)。もっと最近の言語は、C言語との直接的な相互接続性(C++やFortranのようなラウンドアバウト)を提供する可能性があります。それはどのように外国語(例えば、JavaやGoのような)によって提供される関数を指名するかについてより冗長です。

関連する問題