zoukankan      html  css  js  c++  java
  • 重复定义

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

  • 相关阅读:
    悲观锁、乐观锁、行级锁、表级锁
    MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
    刷题-力扣-148. 排序链表
    刷题-力扣-206. 反转链表
    刷题-力扣-203. 移除链表元素
    刷题-力扣-474. 一和零
    刷题-力扣-494. 目标和
    刷题-力扣-160. 相交链表
    刷题-力扣-34. 在排序数组中查找元素的第一个和最后一个位置
    刷题-力扣-33. 搜索旋转排序数组
  • 原文地址:https://www.cnblogs.com/7ants/p/3081201.html
Copyright © 2011-2022 走看看