【问题标题】:SDL: What does "working natively in C++" mean?SDL:“在 C++ 中本地工作”是什么意思?
【发布时间】:2017-06-22 02:42:19
【问题描述】:

我试图对上面的短语有一个大致的了解。我在学习 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++ 中也同样有效?

【问题讨论】:

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


    【解决方案1】:

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

    我认为您可以从该声明中删除以下内容:

    • SDL 是用 C 语言编写的。因此,您可以直接从 C 程序中调用它。
    • C++“被设计为与 C 编译器的源代码和链接兼容”1 所以您可以在您的 C++ 程序上“本机”使用 SDL 是很自然的,这意味着无需翻译/ 编组层是必需的。只需#include头文件,直接调用API即可。
    • 其他语言(例如 C# 和 Python)无法原生调用 C API,并且需要对参数进行混编。此编组在 language binding 中完成。

    【讨论】:

      【解决方案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(... p>

      【讨论】:

        【解决方案3】:

        就编程语言而言,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 调用函数一样——类型 @987654332 @ 在两种语言中的表示方式相同,调用约定也相同。

        C 和 C++ 的这一基本方面不是任何正式标准的一部分,但实际上普遍适用,它是核心兼容性功能之一,它允许新的 C++ 程序在大量现有代码的基础上进行构建,并进行交互“本机”与许多操作系统 API(通常作为 C API 提供)。

        许多工具链提供了类似的链接时互操作性,目标代码用汇编语言编写(您需要密切注意相关的调用约定),Fortran 也很常见(尽管您需要匹配 C 和具有 Fortran 类型的 C++ 基本类型)。其他较新的语言也可能提供与 C 的“直接”互链接性(因此,以一种迂回的方式,与 C++ 和 Fortran),否则它们可能需要一个库更重的“外来函数接口”,即关于它如何指定外语(例如 Java 和 Go)提供的函数的方式更加冗长。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-09
          • 2011-02-09
          • 2011-07-07
          • 2016-12-08
          • 2016-04-19
          • 2015-04-11
          • 2012-04-25
          • 2011-08-25
          相关资源
          最近更新 更多