SDL:"working natively in C++"是什么意思?

SDL: What does "working natively in C++" mean?

本文关键字:是什么 意思 C++ natively working SDL in      更新时间:2023-10-16

我试图对上面的短语有一个大致的了解。我正在学习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++本机协同工作,…":http://libsdl.org/

我认为"native"这个词意味着原始环境,但我不明白为什么用C编写的东西不是用C编写,而是用C++编写的?

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

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

我认为你可以从这句话中去掉以下内容:

  • SDL是用C编写的。因此,您可以直接从C程序中调用它
  • C++"被设计为与C编译器的源代码和链接兼容">1,因此您可以在C++程序上"本机"使用SDL是很自然的,这意味着不需要翻译/编组层。您可以简单地#include头文件,并直接调用API
  • 其他语言,如C#和Python,不能以本机方式调用C API,需要对参数进行混搭。这种编组是在语言绑定中完成的

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

就编程语言而言,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和C++基本类型与Fortran的类型相匹配)。其他较新的语言也可能提供与C的"直接"互链接性(因此,以一种迂回的方式,与C++和Fortran),或者它们可能需要一个更重库的"外部函数接口",该接口对如何命名外部语言(如Java和Go)提供的函数有点详细。