我试图弄清楚上面这句话的一般意义。我正在学习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 ++中也能正常工作?
答案 0 :(得分:7)
SDL是用C语言编写的,与C ++本身一起工作,并且有一些绑定可用于其他几种语言,包括C#和Python。
我认为你可以从这句话中删除以下内容:
#include
头文件,并直接调用API。答案 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),这一点有点冗长。