2010-04-14 61 views
3

我已经创建了一些数学函数,这些函数将用于main()和多个主机类中的成员函数。我认为将这些数学函数作为全局范围是最容易的,但我不知道如何做到这一点。无法声明和识别全局函数

我目前把所有的函数放在一个名为Rdraws.cpp的文件中,其中的原型是Rdraws.h。即使使用了所有的#includesexterns,我在main()的第一个函数调用中也收到了“symbol not found”编译器错误。

这是我有:

// Rdraws.cpp 
#include <cstdlib> 
using namespace std; 
#include <cmath> 

#include "Rdraws.h" 
#include "rng.h" 

extern RNG rgen // this is the PRNG used in the simulation; global scope 

void rmultinom(double p_trans[], int numTrials, int numTrans, int numEachTrans[]) 
{ // function 1 def 
} 

void rmultinom(const double p_trans[], const int numTrials, int numTrans, int numEachTrans[]) 
{ // function 2 def 
} 

int rbinom(int nTrials, double pLeaving) 
{ // function 3 def 
} 

// Rdraws.h 

#ifndef RDRAWS 
#define RDRAWS 

void rmultinom(double[], int, int, int[]); 
void rmultinom(const double[], const int, int, int[]); 
int rbinom(int, double); 

#endif 

// main.cpp 
... 
#include "Rdraws.h" 
... 

extern void rmultinom(double p_trans[], int numTrials, int numTrans, int numEachTrans[]); 
extern void rmultinom(const double p_trans[], const int numTrials, int numTrans, int numEachTrans[]); 
extern int rbinom(int n, double p); 

RNG rgen; // global PRNG object created for simulation 

int main() { ... } 

我很新的节目。如果有一个非常聪明的方法来做到这一点,我很想知道。


更新

我是一个白痴并没有意识到我还没有在我的编译器包括Rdraws.cpp。作为一张海报,我也忘了一个分号。

如果在这里概述的方法可以改进,我仍然会很感激建议。

+0

梅。对于“编程相当新颖”的人来说,这看起来相当不错。 – 2010-04-14 16:08:23

回答

2

您使用哪种编译器?您需要先将所有源文件编译为目标文件,然后将所有目标文件链接在一起。

例子:

g++ -c -Wall -O2 main.cpp 
g++ -c -Wall -O2 Rdraws.cpp 

然后拿到可执行...

g++ -s main.o Rdraws.o 
+0

Holy ...对不起,我在编译时没有包含Rdraws.cpp。 <非常尴尬>现在处理一个“Rdraws.cpp错误:'void'之前的预期初始化器。” – Sarah 2010-04-14 15:57:17

+1

@Sarah:'extern RNG rgen'后面会出现缺失的分号^ – 2010-04-14 15:58:58

+0

@Sarah:那是因为你在第一个'void'之前的一行中忽略了一个分号。由于它是一个变量声明,因此编译器正在寻找初始化程序或分号。 – 2010-04-14 15:59:53

1

几件事情:

  • 我没有看到变量rgen 任何地方所定义。它在Rdraws.cpp中被宣布为 ,但缺少 定义。
  • 要使用全局变量和 功能需要单独 编译(编译只是没有链接) main.cppRdraws.cppmain.oRdraws.o,然后链接 他们获得最终的可执行文件。
0

它看起来像布赖恩R.邦迪有你的answer。我只想指出,你不需要你的main.cpp中的函数声明extern。声明已在Rdraws.h头文件中进行,您可以使用它。

+0

非常感谢! – Sarah 2010-04-14 16:15:11