麻烦宣布和识别全局功能

时间:2010-04-14 15:51:56

标签: c++ function

我已经创建了一些数学函数,这些函数将在main()和多个宿主类中的成员函数中使用。我认为将这些数学函数全局化是最容易的,但我不知道该怎么做。

我目前将所有函数放在一个名为Rdraws.cpp的文件中,原型在Rdraws.h中。即使使用了所有#includesexterns,我也会在main()的第一个函数调用中遇到“未找到符号”编译器错误。

这就是我所拥有的:

// 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。正如一张海报所说,我也忘记了一个分号。

如果可以改进此处列出的方法,我仍然会感激建议。

3 个答案:

答案 0 :(得分:2)

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

示例:

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

然后获取可执行文件......

g++ -s main.o Rdraws.o

答案 1 :(得分:1)

少数事情:

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

答案 2 :(得分:0)

看起来Brian R. Bondy有你的answer。我只想指出你在main.cpp中不需要那些extern函数声明。声明已经在您包含的Rdraws.h头文件中进行。