我正在将Numerical Recipes four1.c与Nayuki的FFT进行比较.两者都是C版本,但我使用的是C++驱动程序.为了进行比较,我正在使用CL.exe和g ++编译(或更恰当地说,链接)到可执行文件中.两人似乎都在争论是否使用extern"C"作为four1功能,但似乎都不关心Nayuki的.我为four1制作了一个头文件,检查_WIN32是为了适当切换,它可以工作,但似乎是一个完全无法接受的黑客攻击.我该如何解决这个问题?
这是头文件:
#pragma once
#ifdef _WIN32
extern "C" void four1(float data[], unsigned long nn, int isign);
#else
void four1(float data[], unsigned long nn, int isign);
#endif
Run Code Online (Sandbox Code Playgroud)
这就是CL没有外部"C"的情况:
drvr.obj : error LNK2019: unresolved external symbol "void __cdecl four1(float * const,unsigned long,int)" (?four1@@YAXQAMKH@Z) referenced in function _main
drvr.exe : fatal error LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud)
如果使用extern"C",这就是g ++的作用:
/tmp/ccK1Hb2N.o: In function `main':
drvr.cpp:(.text+0x347): undefined reference to `four1'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我按照建议尝试修改头文件,所以现在这里是dfour1.h:
#pragma once …
Run Code Online (Sandbox Code Playgroud) 我已经多次看到这个问题,但基本答案似乎是多次包含头文件.在我的情况下,这不是问题,我不知道是什么.
我有一个基本的c ++文件似乎在这里正常工作:
// Filename : t1.cpp
#include <stdio.h>
struct T1{
int result;
T1(int var1, int var2) {
result = var1 * var2;
}
};
void main(void){
T1 t(2, 3);
printf("%d\n", t.result);
}
Run Code Online (Sandbox Code Playgroud)
编译并运行时,会产生答案6.大.现在,当我将这段代码分成两个文件,一个.cpp和一个.h时,我得到错误(错误C2011:'T1':'struct'类型重定义).这两个不同的文件是这样的:
//Filename : test1.h
#ifndef TEST_H
#define TEST_H
struct T1{
int result;
T1(int var1, int var2);
};
#endif
//Filename : test1.cpp
#include "test1.h"
struct T1{
int result;
T1(int var1, int var2) {
result = var1 * var2;
}
};
Run Code Online (Sandbox Code Playgroud)
我曾经尝试过使用#pragma一次,以及使用class而不是struct,但这并不重要.这里有些根本错误.我不明白它为什么在独立文件中工作,但在分成标题和实现版本时却不行.我需要对标头和实现文件做些什么?