我正在寻找一个庞大的旧 C 程序并将其转换为C ++(我是新手)。
有许多复杂的预处理器黑客正在进行连接,因为程序必须在许多不同配置的许多不同平台上运行。
在一个文件中(称之为file1.c
)我致电 functionA()
。
在另一个文件中(称之为file2.c
)我有functionA()
的定义。
不幸的是,函数的确切类型是由以令人眼花缭乱的方式创建的宏集合指定的。
现在链接器抱怨:
functionA是一个未解析的外部符号。
我怀疑问题是file1.c中的原型与file2.c中看到的函数的真实定义略有不同。
由于_cdecl
和fastcall
之间以及有和没有__forceinline
之间的不匹配,存在很多微妙差异的范围。
有没有办法显示完全编译器认为functionA()
的类型file1.c
而不是file2.c
?
答案 0 :(得分:1)
您可以将标志传递给编译器(/ P,我认为),使其输出传递给编译器的完整预处理输出 - 然后您可以打开这个(巨大的)文件,并搜索它和你需要的信息将在那里,某处。
答案 1 :(得分:1)
你真的必须将所有现有的C代码转换为C ++吗?这可能是很多工作,尤其是考虑到你到目前为止所描述的内容。
相反,您可以使用extern "C"
在C ++中编写新代码并调用C代码。例如,在C ++源文件中,您可以:
extern "C" {
#include "old_c_header.h"
}
这改变了链接,因此C ++编译器生成对C代码的外部引用而没有名称错位,允许链接器匹配所有内容。
答案 2 :(得分:0)
通常你应该在输出中有预期的和实际的签名。
否则,您可以指示编译器将预处理的结果输出到单独的文件中,cl.exe /p
表示MSVC和gcc gcc -E
。