Visual C++ 从 C++ 引用 C 函数

VisualC++ referencing C functions from C++

我正在尝试使用来自 C++ 应用程序的 ONCRCP-Windows port,但我在库中引用函数时遇到了一些问题。 在库中有一个 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;
}

header 文件中存在相同函数的声明,如下所示:

// 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 中这并没有抱怨......但是我试图包含 header 文件,将 #include 包装在 extern C{ #include... }但这没有帮助。 奇怪的是,用

替换了 header 中的定义
DllExport void   xdrstdio_create(XDR *xdrs, FILE *file, enum xdr_op op);

使库无法编译并出现错误

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

我没有花时间追踪第二个问题...我更愿意理解为什么第一个案例在 C 中工作正常但在 C++ 中却不行

C 允许您在声明(函数原型)中不指定任何参数,编译器将解析它,因为函数采用未知数量的未指定参数。在 C++ 中,不带参数的函数声明意味着该函数不接受任何参数,它与使用参数 void 相同。您需要在声明中指定参数。

这会导致您的错误:无法回答为什么在添加参数时出现错误,因为问题没有显示更多上下文,但有根据的猜测是您遗漏了一些头文件。您是否包含声明 XDR 的头文件?你包括 <stdio.h>(对于 FILE)吗?

哦,亲爱的。您已经了解了 C 和 C++ 之间的细微差别之一。

在 C++ 中

void   xdrstdio_create();

声明一个参数为零的函数。在 C 语言中,它声明了一个函数 但您没有告诉编译器它需要多少参数 !传递正确类型的正确数量的参数取决于程序员——如果你弄错了,……祝你好运!

这是一种古老的函数声明方式,早于第一个 C 标准(距今将近 30 年),并且只是为了向后兼容而保留。

在 C++ 中,您必须将函数声明为:

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

... 这意味着您需要定义类型定义 XDRFILE(后者将在 <stdio.h> 中 - 不知道您会在哪里找到XDR.

更好的解决方案可能是找到一个使用不到 25 年历史的 C 的库(非常 不太可能是任何具有 C++ 编译器的平台,但是至少没有 C89 编译器。)