0

我正在处理一个巨大的旧C程序并将其转换为 C++(我是新手)。

由于程序必须在许多不同的平台上以许多不同的配置运行,因此存在许多复杂的预处理器黑客攻击。

在一个文件中(调用它file1.c)我正在调用 functionA()
在另一个文件(调用它)中,file2.c我有一个.functionA()

不幸的是,函数的确切类型是由一组以令人眼花缭乱的方式创建的宏指定的。

现在链接器抱怨说:

functionA 是一个未解析的外部符号。

我怀疑问题在于 file1.c 中看到的原型与 file2.c 中看到的函数的真实定义略有不同。

_cdecl由于 and 之间以及fastcallwith 和 without 之间的不匹配,存在很多细微差异__forceinline

有什么方法可以准确地显示编译器认为的类型functionA()file1.c什么file2.c

4

3 回答 3

1

您可以将标志传递给编译器(我认为是/P),使其输出传递给编译器的完整预处理输出 - 然后您可以打开这个(巨大的)文件,并搜索它和您需要的信息会在那里,某处。

于 2009-10-01T08:33:24.600 回答
1

您是否必须将所有现有的 C 代码实际转换为 C++?这可能需要做很多工作,尤其是考虑到您到目前为止所描述的内容。

相反,您可以用 C++ 编写新代码并使用extern "C". 例如,在 C++ 源文件中,您可以:

extern "C" {
#include "old_c_header.h"
}

这改变了链接,因此 C++ 编译器生成对 C 代码的外部引用,而无需名称修改,从而允许链接器匹配所有内容。

于 2009-10-01T08:36:38.270 回答
0

通常,您应该在输出中有预期的和实际的签名。

否则,您可以指示编译器将预处理结果输出到单独的文件中,cl.exe /p用于 MSVC 和 gcc gcc -E

于 2009-10-01T08:37:50.890 回答