重复定义

为了避免在项目中重复定义,一定要遵守“头文件中声明,源文件中定义、实现”,在需要的地方进行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];
    }
};
View Code

源文件

#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)
{
}
View Code

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;
}
View Code

数组funArr放在头文件中将会发生link错误

原文地址:https://www.cnblogs.com/7ants/p/3081201.html