为了避免在项目中重复定义,一定要遵守“头文件中声明,源文件中定义、实现”,在需要的地方进行extern声明。
比如在一个头文件中声明了一个数组,源文件中使用了这个数组,在main文件中也使用了这个数组,那么这个数组放在头文件中将会在link中出现重复定义。
解决的方法就是在源文件中进行数组的定义,在main文件中进行extern声明。
头文件

#pragma once #include <cmath> #include <cstring> #include <assert.h> typedef double(* PtrFun)(double); const int maxIdFun = 16; class FunctionEntry { public: PtrFun pFun; char *strFun; }; class SymbolTable; class FunctionTable { private: PtrFun _pFun[maxIdFun]; int _size; public: FunctionTable(SymbolTable & symTab, FunctionEntry funArr[]); ~FunctionTable(void); int Size()const{return _size;} PtrFun GetFun(int id)const { return _pFun[id]; } };
源文件

#include "FunctionTable.h" #include "SymbolTable.h" FunctionEntry funArr[maxIdFun] = { log, "log", log10, "log10", exp, "exp", sqrt, "sqrt", sin, "sin", cos, "cos", tan, "tan", atan, "atan", sinh, "sinh", cosh, "cosh", tanh, "tanh", asin, "asin", acos, "acos", atan, "atan", 0, "" }; FunctionTable::FunctionTable(SymbolTable & symTab, FunctionEntry funArr[]) : _size(0) { for(int i = 0; i<maxIdFun; i++) { int len = strlen(funArr[i].strFun); if(len == 0) break; _pFun[i] = funArr[i].pFun; int j = symTab.ForceAdd(funArr[i].strFun,len); assert(i == j); ++_size; } } FunctionTable::~FunctionTable(void) { }
main文件

#include <windows.h> #include <iostream> #include "Scanner.h" #include "SymbolTable.h" #include "Parser.h" #include "FunctionTable.h" extern Status; const int maxBuf = 100; extern FunctionEntry funArr[]; int main() { char buf[maxBuf]; Status status; SymbolTable symTab(100); FunctionTable funTab(symTab, funArr); std::cout<<symTab.GetString(10)<<std::endl; system("pause"); return 0; }
数组funArr放在头文件中将会发生link错误