SDL:“C++中的本地工作”意味着什么?

2024-04-28 19:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对上面这句话有个大概的理解。我在学习PyGame,遇到了SDL(简单的DirectMedia层)参考。在

从PyGame引用SDL:“PyGame是一个针对SDL的python包装器,由Pete Shinners编写。”http://www.pygame.org/docs/tut/newbieguide.html

我查阅了SDL(上面的URL中的SDL链接[单击SDL]),并进入“SDL是用C编写的,用C++来工作,……”这里:^ {A2}

我已经考虑了“原生”这个词暗示了原始环境,但我不明白为什么C写的东西不是C++中的原生而是C++中的原生?在

这个短语是否意味着它在C++中也一样有效?在


Tags: orghttpurldocshtmlwwwpygamesdl
3条回答
<> P>尽管语言之间有很多相似之处,但是C和C++不是同一种语言,在C++编译器中有几个C代码不会编译的区域。在

其中一个例子如下:

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

在C语言中,这段代码将被编译。在C++中,这是非法代码,必须改写为

^{pr2}$

这个例子和其他许多例子都可以在这里找到:http://www.geeksforgeeks.org/write-c-program-wont-compiler-c/

当你的pythonsdl的SDK(。。。Oy)表示它是用C编写的,并且在C++中是正常工作的,这几乎可以肯定地表明,在代码中没有像我所引用的例子。在

C++和C在编程语言方面享有特别好的链接时间关系。任何一种语言编写的函数都可以从另一种语言的代码中调用(只要所有代码都是用一致的工具链编译的),而且这两种语言共享一组“意思相同”的通用基本类型。在

为了举例说明,考虑一个简单的库函数foo取一个整数并返回一个整数。首先,我们可以编写两种语言都有效的头文件:

#ifndef H_FOO
#define H_FOO

#ifdef __cplusplus
extern "C" {
#endif

int foo(int);

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

#endif  // H_FOO

接下来,我们可以提供实现这个函数的C代码:

lib\u impl.c:

^{pr2}$ 最后,我们可以从C++中使用这个库:

附录cpp:

#include "foo.h"

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

int main() { XYZ(10); }

在链接时,app.cpp翻译单元中的外部符号foo可以与来自{}翻译单元的导出符号foo匹配,即使它们是从不同的语言编译的。两种语言中的类型{{CD6}}意思是“相同”,在这一意义上,调用C++中的函数^ {< CD7> }导致正确调用,就像C代码调用了具有参数^ {< CD7> }的函数。类型^ {< CD6> }以相同的方式表示,并且调用约定在两种语言中都是相同的。在

<>这个C和C++的基本方面,它不是任何形式的标准,但实际上是普遍的,是核心的兼容性特征之一,它允许新的C++程序在大量的现有代码上建立,并且与许多操作系统API(通常提供为C API)交互地“原生”地交互。在

类似的链接时间互操作由许多工具链提供,其中目标代码是在汇编中编写的(在这里你需要更密切地关注相关的调用约定),并且它也与FORTRAN(通常需要用Fortran的类型匹配C和C++基本类型)。其他的,最近的语言也可以提供与C(直接,用C++和FORTRAN的迂回方式)的“直接”的跨链接性,或者,否则它们可能需要一个更重的库“外部功能接口”,这是关于它如何指定由外语提供的功能(例如java和go)更冗长的。在

SDL is written in C, works natively with C++, and there are bindings available for several other languages, including C# and Python.

我想你可以从这个声明中去掉以下内容:

  • SDL是用C语言编写的,因此,您可以直接从C程序调用它。在
  • C++是源于C编译器的源代码和链接,它是“SUP> ^ {A1}”,所以在C++程序中使用“本地”SDL是自然的,这就意味着不需要翻译/编组层。您只需#include头文件,并直接调用api。在
  • 其他语言,如C#和Python不能以本机方式调用capi,并且需要参数mashalling。这个编组是在language binding中完成的。在

相关问题 更多 >