Программирование. Принципы и практика использования C++ Исправленное издание, стр. 387
void f(void); /* не принимает никаких аргументов */
int old_style(p,b,x) char* p; char b;{ /* ... */}
intxold_style()intold_style()old_style(); /* OK: пропущены все аргументы */old_style("hello",'a',17); /* OK: все аргументы имеют правильный тип */old_style(12,13,14); /* OK: 12 — неправильный тип */ /* но old_style() может не использовать p */Компилятор должен пропустить эти вызовы (но мы надеемся, что он предупредит о первом и третьем аргументах).
Мы рекомендуем придерживаться следующих правил проверки типов аргументов функций.
• Последовательно используйте прототипы функций (используйте заголовочные файлы).
• Установите уровень предупреждений компилятора так, чтобы перехватывать ошибки, связанные с типами аргументов.
• Используйте (какую-нибудь) программу
lintВ результате вы получите код, который одновременно будет кодом на языке C++.
27.2.4. Вызов функций, написанных на языке С, из программы на языке С++, и наоборот
Вы можете установить связи между файлами, скомпилированными с помощью компилятора языка С, и файлами, скомпилированными с помощью компилятора языка С++, только если компиляторы предусматривают такую возможность. Например, можете связать объектные файлы, сгенерированные из кода на языке С и С++, используя компиляторы GNU C и GCC. Можете также связать объектные файлы, сгенерированные из кода на языке С и С++, используя компиляторы Microsoft C и C++ (MSC++). Это обычная и полезная практика, позволяющая использовать больше библиотек, чем это возможно при использовании только одного из этих языков.
f(int)f(double)// вызов функции на языке C из кода на языке C++:extern "C" double sqrt(double); // связь с функцией языка Cvoid my_c_plus_plus_fct(){ double sr = sqrt(2);}По существу, выражение
extern "C"sqrt(double)Мы можем также использовать выражение
extern "C"// вызов функции на языке C++ из кода на языке C:extern "C" int call_f(S* p, int i){ return p–>f(i);}Теперь в программе на языке C можно косвенно вызвать функцию-член
f()/* вызов функции на языке C++ из функции на языке C: */int call_f(S* p, int i);struct S* make_S(int,const char*);void my_c_fct(int i){ /* ... */ struct S* p = make_S(x, "foo"); int x = call_f(p,i); /* ... */}Для того чтобы эта конструкция работала, больше о языке С++ упоминать не обязательно.
Выгоды такого взаимодействия очевидны: код можно писать на смеси языков C и C++. В частности, программы на языке C++ могут использовать библиотеки, написанные на языке C, а программы на языке C могут использовать библиотеки, написанные на языке С++. Более того, большинство языков (особенно Fortran) имеют интерфейс вызова функций, написанных на языке С, и допускают вызов своих функций в программах, написанных на языке С.
В приведенных выше примерах мы предполагали, что программы, написанные на языках C и C++, совместно используют объект, на который ссылается указатель
p