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).