2017-02-04 2 views
2

Я пытаюсь получить общее представление о вышеупомянутой фразе. Я изучал PyGame и столкнулся с SDL (Simple DirectMedia Layer) ссылкой.SDL: Что означает «работа изначально на C++»?

Ссылка на SDL от PyGame: «Pygame - это оболочка python для SDL, написанная Пит Синнерс». http://www.pygame.org/docs/tut/newbieguide.html

Я посмотрел SDL (SDL ссылку в URL выше [нажмите SDL]) и врезался в "SDL написана на C, работает изначально с C++, ..." здесь: http://libsdl.org/

У меня есть считал слово «родным» подразумевать исходную среду, но я не понимаю, почему что-то, что было написано на C, не является родным в C, а скорее родным на C++?

Означает ли это выражение, что он работает так же хорошо на C++?

ответ

6

SDL написан на языке C, работает на языке C++, и существуют привязки для нескольких других языков, включая C# и Python.

Я думаю, вы можете забрать следующие из этого заявления:

  • SDL написан на C. Таким образом, вы можете вызвать его непосредственно из программы C.
  • C++ «был разработан как источник и ссылка, совместимая с компиляторами C» 1, поэтому вполне естественно, что вы можете использовать SDL «изначально» на своих программах на C++, то есть не требуется никакого слоя перевода/сортировки. Вы можете просто #include файлы заголовков и напрямую обращаться к API.
  • Другие языки, такие как C# и Python, не могут изначально обращаться к API-интерфейсам C и требуют разметки параметров. Эта сортировка выполняется в language binding.
1

Несмотря на много общего между языками, 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/

Когда SDK вашего Python SDL указывает (... Оу.) что он написан на C и работает изначально на C++, это почти наверняка указывает на то, что такие примеры, как то, что я привел, не присутствуют в коде.

1

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); } 

во время компоновки, внешний символ foo в блоке app.cpp перевода может быть сопоставлен с экспортируемым символом foo из блока lib_impl.c перевода, даже если они составлены из разные языки. Типы int означают «то же самое» на обоих языках в том смысле, что вызов функции со значением 10 в C++ вызывает правильный вызов, как если бы код C вызывал функцию с аргументом 10 - тип int представлен таким же образом, и вызывающие соглашения одинаковы, на обоих языках.

Этот фундаментальный аспект C и C++, который не является частью какого-либо официального стандарта, но эффективно универсально правдивым, является одной из основных функций совместимости, которая позволяет новым программам на C++ строить на основе существующего кода, а также взаимодействовать «изначально» со многими API-интерфейсами операционной системы (которые обычно предоставляются как API-интерфейсы C).

Подобная взаимосвязь времени соединения обеспечивается множеством цепей инструментов с кодом объекта, написанным на сборке (там, где вам нужно уделять больше внимания соответствующим соглашениям о вызовах), и это также часто встречается с Fortran (хотя вам необходимо сопоставить C и базовые типы C++ с типами Fortran). Другие, более свежие, языки могут также обеспечивать «прямую» взаимосвязь с C (и, таким образом, обходным путем, с C++ и Fortran), иначе им может потребоваться более «большой интерфейс» для библиотеки, который является бит более подробный о том, как он назначает функции, предоставляемые иностранным языком (например, как Java и Go).