SDL:“在C ++中本地工作”是什么意思?

时间:2017-02-04 21:54:47

标签: python c++ python-2.7 pygame sdl

我试图弄清楚上面这句话的一般意义。我正在学习PyGame,并参加了SDL(Simple DirectMedia Layer)参考。

从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 ++中也能正常工作?

3 个答案:

答案 0 :(得分:7)

  

SDL是用C语言编写的,与C ++本身一起工作,并且有一些绑定可用于其他几种语言,包括C#和Python。

我认为你可以从这句话中删除以下内容:

  • SDL是用C语言编写的。因此,您可以直接从C程序中调用它。
  • C ++"旨在与C编译器兼容源和链接" 1 所以你很自然地可以使用SDL"本地"在您的C ++程序上,意味着不需要翻译/编组层。您可以简单地#include头文件,并直接调用API。
  • 其他语言(如C#和Python)本身无法调用C API,并且需要编组参数。这种编组是在language binding
  • 中完成的

答案 1 :(得分:2)

尽管语言之间有许多相似之处,但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 ++中本地工作时,它几乎可以肯定地表明没有像我这样的例子。被引用的内容存在于代码中。

答案 2 :(得分:2)

就编程语言而言,C ++和C享有特别好的链接时间关系。用任何一种语言编写的函数都可以用另一种语言的代码调用(只要所有代码都使用一致的工具链编译),并且这两种语言共享一组常见的基本类型,这些类型"意思相同" 34。

为了说明,考虑一个简单的库函数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); }

在链接时,foo翻译单元中的外部符号app.cpp可以与foo翻译单元中的导出符号lib_impl.c匹配,即使它们是从不同语言编译。类型int表示&#34;相同&#34;在两种语言中,在C ++中调用具有值10的函数会导致正确的调用,就像C代码使用参数10调用函数一样 - 类型int表示为同样的方式,并且调用约定在两种语言中都是相同的。

C和C ++的这个基本方面,它不是任何正式标准的一部分,但实际上是普遍真实的,是核心兼容性功能之一,它允许新的C ++程序构建在大量现有代码上,以及交互和#34;天然&#34;许多操作系统API(通常作为C API提供)。

类似的链接时互操作性由许多工具链提供,其中目标代码用汇编语言编写(您需要密切关注相关的调用约定),并且它也常见于Fortran(尽管您需要匹配C和使用Fortran类型的C ++基本类型)。其他更近期的语言也可以提供&#34; direct&#34;与C的互连性(因此,以迂回的方式,使用C ++和Fortran),或者它们可能需要更多的库重的外部函数接口&#34;关于如何提名由外语提供的功能(例如Java和Go),这一点有点冗长。