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 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.