Я пытаюсь понять смысл вышеприведенной фразы. Я изучал 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 ++?
SDL написан на C, изначально работает с C ++, и есть привязки, доступные для нескольких других языков, включая C # и Python.
Я думаю, что вы можете убрать из этого утверждения следующее:
#include
файлы заголовков и вызывайте 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/
Когда SDK вашего Python SDL (… 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); }
Во время ссылки внешний символ 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).