Python — SDL: что «изначально работает в C ++» имею в виду?

Я пытаюсь понять смысл вышеприведенной фразы. Я изучал PyGame и наткнулся на ссылку SDL (Simple DirectMedia Layer).

Ссылка на 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 ++?

2

Решение

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

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

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

Другие решения

Несмотря на много общего между языками, 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 (… oy.) Указывает на то, что он написан на 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 операционной системы (которые обычно предоставляются как C API).

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

1
По вопросам рекламы [email protected]