2016-12-02 21 views
0

Я пытаюсь использовать ONCRCP-Windows port из приложения C++, но у меня есть функция ссылки на проблемы в библиотеке. В библиотеке есть C-файл, который содержит следующее определение функции C:VisualC++, ссылающийся на C-функции из C++

//xdr_stdi.c 
…. 
void 
xdrstdio_create(xdrs, file, op) 
    register XDR *xdrs; 
    FILE *file; 
    enum xdr_op op; 
{ 

    xdrs->x_op = op; 
    xdrs->x_ops = &xdrstdio_ops; 
    xdrs->x_private = (caddr_t)file; 
    xdrs->x_handy = 0; 
    xdrs->x_base = 0; 
} 

Декларация той же функции присутствует в файле заголовка, как следующие:

// xdr.h 
DllExport void xdrstdio_create(); /* XDR using stdio library */ 

Если я называю это функция от main.c файла это работает правильно, но если я называю это из main.cpp он жалуется, говоря:

“error C2660: 'xdrstdio_create': function does not take 3 arguments” 

Это действительно имеет смысл для меня, и я искренне удивлен тем, что в C это не жалуется ... Я, однако, пытался включить заголовочный файл, обертывающий #include в extern C{ #include... }, но это не помогло. Как ни странно заменить определение в заголовке на

DllExport void xdrstdio_create(XDR *xdrs, FILE *file, enum xdr_op op); 

Делает библиотека не компилировать с ошибкой ошибки

C2143: syntax error: missing ')' before '*' 

я не тратил времени отслеживать этот второй вопрос вниз ... я предпочел бы понять, почему первый случай отлично работает в C, но не в C++

ответ

3

О, дорогой. Вы столкнулись с одним из тонких различий между C и C++.

В C++

void xdrstdio_create(); 

объявляет функцию, принимая нулевые аргументы. В C он объявляет функцию , но вы не сказали компилятору, сколько аргументов требуется! Программисту нужно передать правильное количество аргументов нужного типа - и если вы ошибетесь, ... удачи!

Это древний стиль объявления функций, который предшествует первому стандарту C (почти 30 лет назад) и поддерживается только для обратной совместимости.

В C++, вы имеют объявить функцию:

DllImport void xdrstdio_create(XDR *xdrs, FILE *file, enum xdr_op op); 

...что означает, что вам нужно иметь определение определений типов XDR и FILE (последние будут в <stdio.h> - не знаю, где вы найдете XDR

Лучшего решения может быть, чтобы найти библиотеку, которая использует C меньше. чем 25 лет (есть очень вряд ли будут какие-либо платформы, на которых есть компилятор C++, но у них нет, по крайней мере, компилятора C89.)

+0

Спасибо большое ... приятное объяснение ... Я не использую windows, и я не нашел ни одного нового порта ONC-RCP ... на самом деле, когда я проверяю файл в текущем дистрибутиве Linux, они передают все параметры ... Я просто понятия не имел, что по-старому они могли бы быть избегать .. . Спасибо за объяснение! – Stefano

3

C позволяет не указывать какие-либо аргументы в объявлении (прототипе функции), а компилятор будет анализировать его, поскольку функция принимает неизвестное количество неуточненных аргументов NTS. В C++ объявление функции без аргументов означает, что функция не принимает никаких аргументов, это то же самое, что и аргумент void. Вам нужно указать аргументы в объявлении.

Что приводит к вашей ошибке: невозможно ответить на вопрос, почему вы получаете ошибки, когда добавляете аргументы, поскольку вопрос не показывает больше контекста, но образованная догадка заключается в том, что вы пропустите некоторый заголовочный файл. Вы включаете заголовочный файл, где объявляется XDR? Включите ли вы <stdio.h> (для FILE)?