LINUX.ORG.RU

Компиляция C (onc rpc) и C++ кода вместе


0

0
Проблема такая: в заголовочных файлах SunRPC написан очень странный код вроде этого:

extern CLIENT *

clnt_create(/*host, prog, vers, prot*/); /*

char *host; -- hostname

u_long prog; -- program number

u_long vers; -- version number

char *prot; -- protocol

*/

или этого:

void clnt_perror(/* CLIENT *clnt, char *msg */); /* stderr */

char *clnt_sperror(/* CLIENT *clnt, char *msg */); /* string */

Как этот кошмар компилируется в примерах, которые идут с пакетом -- ума не приложу. Может, подскажете, в чём тут секрет?

Секрет в том, что функция объявленная как
void f();

в C считается эквивалентной
void f(...);
т.е. принимающей любые аргументы,
а в C++ это считается эквивалентной
void f(void);
т.е. не принимающей ни какие аргументы,
возможно решение сделать так:
extern "C" {
#include "c-header.h"
}
fghj ★★★★★
()
Ответ на: комментарий от fghj
Не, не получилось. Там картинка такая:

file.cpp -> file.h
        |
         -> c_lang_header.h

И когда я из file.cpp обращаюсь к функциям c_lang_header.h, начинается ругань g++, extern "C" не помогает.
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum
Ессно не поможет. В C++ clnt_create(/*host, prog, vers, prot*/), оно же clnt_create(), означает "без аргументов". Переобьяви их как clnt_create(...) или (лучше, наверное) clnt_create(char* host, u_long prog, u_long vers, char* prot).
alexs
()
Ответ на: комментарий от alexs
Хе, это нужно по всем исходникам пробежаться будет! В принципе, если других вариантов не найду, то придётся, но не хотелось бы...
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum
встречал автоматические конверторы

то что ты имееш называется C имени кенигана и ритчи а тебе нужон хотябы AnsiC

cvv ★★★★★
()
Ответ на: комментарий от cvv
Да можно на sed-е или awk нафеячить конвертер, наверное, займусь. А будет лень (наверное, будет :-)) -- поищу готовый.
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum
Я рекомендую написать обертки на С для вызовов SunRPC и положить их в один C-шный модуль.
А для этого модуля уже написать свой h-файл, который будет корректным с точки зрения C++.

"Переобъявлять" же методы, определенные в сторонних библиотеках, я считаю неправильным.


romanSA
()
Ответ на: комментарий от romanSA
Поздно, блин! Прокомпостировали :-) ! Хотя, надо будет так и сделать. Потом.
one_more_hokum ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.